我正在尝试让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({ - 1}}在选项 - 哈希中)
:selected
似乎有效。
我做错了什么?任何人都可以帮我这个吗?
答案 0 :(得分:8)
来自docs:
示例用法(为Author
,Post
的实例选择关联的@post
:
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
返回与可用选项值之一匹配的值。如果匹配,则选择该选项。
答案 1 :(得分:2)
根据docs,如果@my_object.my_method
与其中一个选项具有相同的值,则默认选择该值。
相反,您可以尝试将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) %>
答案 2 :(得分:1)
使用:selected_value
%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
答案 3 :(得分:0)
检查@ my_object.my_method是否返回nil。如果是的话,
如果调用方法返回nil,则不进行选择而不在选项哈希中包含:prompt或:include_blank。
除此之外,您可以尝试使用lambda,就像在rdoc示例中一样
{:disabled => lambda {|category| category.archived? }
在你的情况下,这将是
{:selected => lambda {|obj| obj.id == @my_collection_object.id }}
答案 4 :(得分:-1)
如果您的集合采用2值数组的数组形式,它也可以工作:
CURRENCIES = [["USD", "$"], ["BRL", "R$"]]
<%= collection_select :thing, :currency, CURRENCIES, :first, :last %>
:first
和:last
技巧可以很好地处理这些事情,而无需为它们定义单独的模型。