2009-05-03 7 views
2

私はContactというhas_oneゲストというモデルを持っています。私はそうのようなゲストとして選択することができ、すべての連絡先を一覧表示する選択ヘルパーメソッドを使用しています...Railsでform.selectがモデルを返すようにするにはどうすればよいですか?

<% 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 %> 

このフォームが送信されるたびに、私は得る私の作成を考慮して

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

連絡先を期待していたが、文字列があります。

現在の連絡先をデータベースに保存する前に、フォームから送信された文字列を連絡先に変換する必要があります。

答えて

6

Railsでhas_oneなどの関連付けを作成すると、簡単に割り当てるためにオブジェクトに対して動的に生成される特定のメソッドがあります。

は今、あなたが使っている方法は

@contact.guest = @guest 

であり、あなたの連絡先オブジェクトは、それがで自身を関連付けることができる別のActiveRecordオブジェクトを受け取ることを期待しています。あなたがしようとしているのは、モデルオブジェクトをラップするフォーム内のこのメソッドを "擬似"していることです。 (パラメータから入力される情報は文字列として取り込まれるため、そのエラーが発生します)

これを実装する方法はいくつかあります。まず、ネストされたモデル属性を使用しています。 。 。 (fields_forフォームヘルパーを使用して)使用中のform_for内で子関連をラップすることができる複雑なフォームです。これについての説明は、最大入力に時間がかかるだろう、と幸い複雑なフォーム上の信じられないほどの空きリソースがある:あなたがRailsのを使用している場合

Railscasts Complex Forms part 1

Railscasts Complex Forms part 2

Railscasts Complex Forms part 3

は、また、 2.3では、 "accepts_nested_attributes_for"に関する情報をチェックします。 。 。現在、チュートリアルの明確な欠如がありますが、2.3のリリースではたくさんのことが起こると思います。この便利な小さなヘルパーは、Ryanがスクリーン・キャストで使用するコードの半分を切り捨てて、フォームに従属モデルを受け入れるようにします。

最後に回避策があります。あなたの関係がシンプルで、関連付けるゲストがすでにデータベースに入っていて、使用しているフォームから新しいゲストを作成する必要がない場合は、仮想属性のようなものを使用できます。フォームでは、単に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 

あなたのためにそれを行うには、複雑なフォームを実装することなく、ActiveRecordのモデルを割り当てますどの!

+1

はい。私のユースケースは回避策のシナリオです...ありがとうございました。 –

関連する問題