2009-05-03 4 views
2

저는 has_one guest라는 Contact라는 모델을 가지고 있습니다. 에서form.select가 레일스에서 ​​모델을 반환하도록하려면 어떻게해야합니까?

class Contact < ActiveRecord::Base 
    has_one :guest, :class_name => "Contact", :foreign_key => "guest" 
end 

내 양식이 내가 얻을 제출 될 때마다 내가 지금처럼 게스트로 선택 될 수있는 모든 연락처를 나열하는 선택 도우미 메서드를 사용하고보기 ...

<% form_for(@contact) do |f| %> 
    <%= f.error_messages %> 
    ... 
    <p> 
     <%= f.label :guest %><br /> 
     <% @guests = Contact.find(:all, :order => "lastname").map { |u| [u.lastname + ', ' + u.firstname, u.id] } %> 
     <%= f.select :guest, @guests, {:include_blank => true} %> 
    </p> 
    ... 
<% end %> 

을 만들 접촉을 기대했지만 문자열이 있다고 말하는 오류.

현재 연락처를 데이터베이스에 저장하기 전에 어디에서 어떻게 양식을 제출 한 문자열을 연락처로 변환해야합니까?

답변

6

레일스에서 ​​has_one과 같은 연관을 만들 때 쉽게 할당 할 수 있도록 개체에 대해 동적으로 생성되는 특정 방법이 있습니다.

는 지금 사용하고있는 방법은

@contact.guest = @guest 

입니다 그리고 당신의 연락처 개체는 자신을 연결할 수 있다는 또 다른 액티브 오브젝트를받을 것으로 예상된다. 당신이 무엇을하려하는지, 모델 객체를 감싸는 형태로이 메소드를 "가짜"로 만든다. (매개 변수에서 오는 정보는 문자열로 가져 오므로 오류가 발생합니다.

구현 방법은 여러 가지가 있습니다. 첫 번째는 중첩 된 모델 특성을 사용하는 것입니다. . . (fields_for 양식 도우미를 사용하여) 사용중인 form_for 내에 하위 연결을 래핑 할 수있는 복잡한 양식. 이에 대한 설명은 최대 입력하는 데 시간이 오래 걸릴 것이고, 다행히 복잡한 형태에 엄청난 리소스가 있습니다 : 당신이 레일을 사용하는 경우

Railscasts Complex Forms part 1

Railscasts Complex Forms part 2

Railscasts Complex Forms part 3

는 또한 2.3 다음 "accepts_nested_attributes_for"에 대한 정보를 확인하십시오. . . 지금 당장 자습서가 뚜렷이 부족하지만 2.3 버전이 출시되면서 많은 것들이 나올 것이라고 상상합니다. 이 편리한 작은 도우미는 라이언이 자신의 스크린 캐스트에서 사용하는 코드의 약 절반을 양식에서 하위 모델을 허용하도록 잘라냅니다.

마지막으로 해결 방법이 있습니다. 관계가 단순한 경우, 연결하려는 게스트가 이미 데이터베이스에 있고 사용중인 양식에서 새 게스트를 작성할 필요가 없으면 가상 속성과 같은 것을 사용할 수 있습니다. 양식에서, 단순히 f.select :guest_select처럼 뭔가에 f.select :guest을 변경하고 모델의 메소드를 구현 :

def guest_select=(incoming_id_from_form) 
    contact = Contact.find(incoming_id_from_form) 
    self.guest = contact 
end 

어떤 당신을 위해 그것을 할 수있는 복잡한 형태를 구현하지 않고 액티브 모델을 할당합니다!

+1

예. 내 유스 케이스는 해결 방법 시나리오입니다 ... 고마워요. –

관련 문제