Rails:ActionView-Helper 'collection_select'で値を事前選択します
-
06-07-2019 - |
質問
ActionView-Helper collection_selectを取得しようとしています。
を使用して、ドロップダウンメニューで事前に選択される値を取得します。
どちらでもない(html-option-hashの:selected
)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %>
nor(option-hashの:selected
)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %>
動作しているようです。
間違っているのは何ですか?誰でもこれで私を助けることができますか?
解決
ドキュメントから:
使用例( Post
、 @post
のインスタンスに関連する Author
を選択):
collection_select(:post, :author_id, Author.all, :id, :name_with_initial)
@ post.author_id
がすでに1の場合、これは以下を返します:
<select name="post[author_id]">
<option value="">Please select</option>
<option value="1" selected="selected">D. Heinemeier Hansson</option>
<option value="2">D. Thomas</option>
<option value="3">M. Clark</option>
</select>
したがって、 @ my_object.my_method
が使用可能なオプション値のいずれかに一致する値を返すことを確認する必要があります。一致する場合、そのオプションが選択されます。
他のヒント
の場合、ドキュメントによると@ my_object.my_method
のオプションの1つと同じ値があり、デフォルトで選択されます。
逆に、 options_from_collection_for_select
select_tag
と組み合わせて:
<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %>
:selected_value
%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
@ my_object.my_methodがnilを返すかどうかを確認します。もしそうなら、
メソッドを呼び出すとnilが返される場合、オプションハッシュに:promptまたは:include_blankを含めずに選択は行われません。
それ以外は、rdocの例のように、ラムダを使用してみることができます
{:disabled => lambda {|category| category.archived? }
あなたの場合、これは次のようになります
{:selected => lambda {|obj| obj.id == @my_collection_object.id }}
コレクションが2値配列の配列の形式でも機能します:
CURRENCIES = [["USD", "<*>quot;], ["BRL", "R<*>quot;]]
<%= collection_select :thing, :currency, CURRENCIES, :first, :last %>
:first
および:last
のトリックは、これらに対して個別のモデルを定義する必要なく、非常にうまく機能します。