Rails:在ActionView-Helper'collection_select'中预选一个值

时间:2009-06-19 16:19:27

标签: ruby-on-rails actionview actionviewhelper

我正在尝试让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

似乎有效。

我做错了什么?任何人都可以帮我这个吗?

5 个答案:

答案 0 :(得分:8)

来自docs

示例用法(为AuthorPost的实例选择关联的@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_selectselect_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技巧可以很好地处理这些事情,而无需为它们定义单独的模型。