代码之家  ›  专栏  ›  技术社区  ›  Ryan Florence

如何在选择框中获取查找表值?

  •  1
  • Ryan Florence  · 技术社区  · 15 年前

    与《敏捷》一书一起阅读,它在脚注中写道:

    ... 您只需向select助手传递查找时执行AND(: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') 但这仍然让我看起来很古怪。

    我做错了什么?

    2 回复  |  直到 15 年前
        1
  •  3
  •   askegg    15 年前
    Source.find(:all)
    

    将返回一个源对象数组-这不是您想要的。您需要的是一系列选项。某物 喜欢 :

    select(:source, "source_id", Source.all.collect {|p| [ p.source, p.id ] })
    
        2
  •  3
  •   Tate Johnson    15 年前

    您需要传递一组选项(或键值选项)。中的第三个参数 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(Model.all.map { |m| [m.attr1, m.attr2] })
    

    …并使用 选择 视图内部的方法

    <%= f.select(:method, Model.all.map { |m| [m.attr1, m.attr2] }) %>