与敏捷书一起阅读,它在脚注中说:
...您只需将选择助手传递给您在查找中执行命令(:all)的结果 表。
好的......
<%= f.select :source, Source.find(:all) %>
我的源控制器(以及表格)如下所示:
create_table :sources do |t|
t.string :source
t.timestamps
end
但我的选择框很乱,我在所有值和显示中得到这种类型的数据:
#<Source:0x23a2bfc>
所以我尝试了Source.find(:all, :select => 'name,id')
,但这仍然让我看起来很糟糕。
我做错了什么?
答案 0 :(得分:3)
Source.find(:all)
将返回一个Source对象数组 - 这不是你想要的。你想要的是一系列选项。 之类的东西:
select(:source, "source_id", Source.all.collect {|p| [ p.source, p.id ] })
答案 1 :(得分:3)
您需要传递一组选项(或键值选项)。 select
中的第三个参数实际上传递给options_for_select
方法。用一个例子可以很好地说明这一点。
options_for_select(["a", "b"])
...变成
<option>a</option><option>b</option>
大多数情况下,您对键值对更感兴趣
options_for_select([["a", "1"], ["b", "2"]])
...变成
<option value="1">a</option><option value="2">b</option>
作为简介,传递整个对象集合并映射它们以符合options_for_select
所期望的内容是很常见的。
options_for_select(Model.all.map { |m| [m.attr1, m.attr2] })
...并使用视图中的select
方法回答您的问题
<%= f.select(:method, Model.all.map { |m| [m.attr1, m.attr2] }) %>