如何使用哈希数组填充select_tag?

And*_*vey 21 ruby-on-rails

在Rails 3.2应用程序中,我正在尝试添加一个从外部API调用获取其数据的选择字段.此数据作为哈希数组返回:

[{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
Run Code Online (Sandbox Code Playgroud)

如何使用此数据构建一个类似于以下内容的选择字段:

<select>
  <option value="001"> NameA </option>
  <option value="002"> NameB </option>
</select>
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢下面的建议,我尝试了以下方法:

A:

<%= select_tag 'model[field]', options_from_collection_for_select(@hash, :id, :name) %>
Run Code Online (Sandbox Code Playgroud)

给出错误:

undefined method `name' for {"name"=>"NameA", "id"=>"001"}:Hash
Run Code Online (Sandbox Code Playgroud)

B:

<%= select_tag 'model[field]', options_from_collection_for_select(@hash) %>
Run Code Online (Sandbox Code Playgroud)

修复错误但生成错误的标记

<option value="{"name"=>"NameA", "id"=>"001"}"> {"name"=>"NameA", "id"=>"001"}</option>
Run Code Online (Sandbox Code Playgroud)

所以我认为我的问题是正确地格式化哈希数组,而且我不太了解如何操作哈希数组来解决这个问题.

除非我完全关注这个方向,否则我认为这个问题的关键是在这个问题的顶部重新格式化数组给出:

{"NameA" =>"001", "NameB" =>"002"}
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?如果是这样,怎么样?

Nik*_*kos 39

如果你有像这样的哈希数组:

@people = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
Run Code Online (Sandbox Code Playgroud)

你可以使用这样的方法使用options_for_selecthelper collect:

= select_tag "people", options_for_select(@people.collect {|p| [ p['name'], p['id'] ] })
Run Code Online (Sandbox Code Playgroud)

它完成了:-).


use*_*775 14

只在一个命令中执行此操作的更好方法:

<%= select_tag "model[field]", options_for_select(@array_of_hashes.map { |obj| [obj['name'], obj['id']] }) %>
Run Code Online (Sandbox Code Playgroud)

使用您的示例哈希:

irb> @array_of_hashes = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
=> [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
irb> @array_of_hashes.map { |obj| [obj['name'], obj['id']] }
=> [["NameA", "001"], ["NameB", "002"]]
Run Code Online (Sandbox Code Playgroud)