Ruby on rails Rails:在ActionView帮助程序“collection\u select”中预选一个值

Ruby on rails Rails:在ActionView帮助程序“collection\u select”中预选一个值,ruby-on-rails,actionview,actionviewhelper,Ruby On Rails,Actionview,Actionviewhelper,我正在尝试让参数获取一个将在下拉菜单中预选的值 都不:在html选项哈希中选择 <%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %> <%= collection_select(:my_object, :my_method, @my_collection,

我正在尝试让参数获取一个将在下拉菜单中预选的值

都不:在html选项哈希中选择

<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %>
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %>
似乎有效

我做错了什么?有人能帮我吗?

根据,如果@my_object.my_方法的值与其中一个选项的值相同,则默认情况下将选择该选项

相反,您可以尝试结合使用:


检查@my_object.my_方法是否返回nil。如果是的话

如果调用方法返回nil,则在选项哈希中没有include:prompt或:include_blank时,不会进行任何选择

除此之外,您可以尝试使用lambda,如rdoc示例中所示

{:disabled => lambda {|category| category.archived? }
在你的情况下,这看起来像

{:selected => lambda {|obj| obj.id == @my_collection_object.id }}
从:

为Post实例@Post选择关联作者的示例用法:

如果@post.author\u 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_方法返回一个与可用选项值之一匹配的值。如果存在匹配项,则将选择该选项。

使用:选定值


如果您的集合是以2值数组的形式存在,则它也可以工作:

CURRENCIES = [["USD", "$"], ["BRL", "R$"]]

<%= collection_select :thing, :currency, CURRENCIES, :first, :last %>

:first和:last技巧对这些东西非常有效,无需为它们定义单独的模型。

我接受了这个答案,尽管我刚刚注意到我必须从collection\u select切换到select。我用上面的例子选择了两个集合来选择两个不同的post.author\u id,这样我就可以在页面上比较它们了。我在每个集合上都有一个javascript观察器,它不起作用,因为集合总是输出以下html元素id:post\u author\u id。我的实现不起作用,因为两个集合的html元素id相同。是的,Rails不能保证元素ID的唯一性这一事实是一个问题,它不能回答如何选择某个值的问题
<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>
%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
CURRENCIES = [["USD", "$"], ["BRL", "R$"]]

<%= collection_select :thing, :currency, CURRENCIES, :first, :last %>