1

与敏捷书一起阅读,它在脚注中说:

...您只需将在查找表上执行 find(:all) 的结果传递给 select 助手。

好的 ...

<%= 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'),但这仍然给了我看起来古怪的东西。

我究竟做错了什么?

4

2 回答 2

3
Source.find(:all)

将返回一个 Source 对象数组——这不是你想要的。你想要的是一系列选项。像:_

select(:source, "source_id", Source.all.collect {|p| [ p.source, p.id ] })
于 2009-08-20T06:29:18.430 回答
3

您需要传递一组选项(或键值选项)。in 第三个参数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] }) %>
于 2009-08-20T06:44:13.597 回答