2017-10-27 11 views
0

私はいくつかのフィールドがあるオブジェクトを持っています - namecode、もちろんidです。SimpleFormのRuby on Rails:selectまたは:collection_select

次のコードを使用して、私のコントローラは選択されたオブジェクトのidを受け取りました(名前は選択ドロップダウンに表示されます)。

<%= form.input :department_short, label: I18n.t('department'), wrapper_html: {class: 'header'}, 
          placeholder: 'Select department', as: :collection_select, collection: @departments, required: false %> 

私が望むのは、別のフィールド(あるいは、これらのフィールドの1つ以上に基づくもの)を送信することです。これを行う方法はありますか?

答えて

3

あなたは、ラムダと一緒value_methodプロパティを使用することができ、このように:このように

<%= form.input :department_short, label: I18n.t('department'), :value_method => lambda {|t| "#{t.name} - #{t.code}"}, wrapper_html: {class: 'header'}, 
          placeholder: 'Select department', as: :collection_select, collection: @departments, required: false %> 

、「名前 - コード」送信する必要がありますたとえば、オブジェクトあなたから値を。ラムダ操作では、必要に応じてオブジェクトから取得した値を操作できます。アイデアを得ることができれば助かります。がんばろう!

EDIT:

公式ドキュメント(https://github.com/plataformatec/simple_form)から:

Collection inputs accept two other options beside collections: 

label_method => the label method to be applied to the collection to retrieve the label (use this instead of the text_method option in collection_select) 

value_method => the value method to be applied to the collection to retrieve the value 

また、あなたのモデルにメソッドto_labelを持っている場合、それは標識のためにそのメソッドを使用すると思われるので、あなたドンあなたがそれを使いたいすべての選択肢にlabel_methodを入れなければなりません。ドキュメントには同様のto_valueメソッドがあるかどうかは言及されていませんが、確かにいいと思うでしょう

+0

すごくおかげさまです。私はここにいますが、同様の方法でドロップダウンの表示名を変更できますか? –

+1

@apええ、label_methodは同じように動作するので、それを使ってラベルを変更することができます –

+0

あなたはそのような王子です。 (これが公式の文書にあればいいのですが、どこかでそれらを紛失していますか?) –

関連する問題