23

在 Rails 3.2 应用程序中,我试图添加一个选择字段,该字段从外部 API 调用中获取其数据。此数据以哈希数组的形式返回:

[{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]

我怎样才能使用这些数据来构造一个看起来像这样的选择字段:

<select>
  <option value="001"> NameA </option>
  <option value="002"> NameB </option>
</select>

编辑:

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

A:

<%= select_tag 'model[field]', options_from_collection_for_select(@hash, :id, :name) %>

给出一个错误:

undefined method `name' for {"name"=>"NameA", "id"=>"001"}:Hash

乙:

<%= select_tag 'model[field]', options_from_collection_for_select(@hash) %>

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

<option value="{"name"=>"NameA", "id"=>"001"}"> {"name"=>"NameA", "id"=>"001"}</option>

所以我认为我的问题是正确格式化散列数组,而我对操作散列数组的了解还不够,无法弄清楚如何做到这一点。

除非我完全按照磨损的方向寻找,否则我认为这个问题的关键是重新格式化这个问题顶部的数组以给出:

{"NameA" =>"001", "NameB" =>"002"}

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

4

6 回答 6

40

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

@people = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]

您可以通过以下方法使用options_for_select助手collect

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

它完成了:-)。

于 2013-11-11T10:43:13.937 回答
17

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

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

使用您的示例哈希:

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"]]
于 2013-07-31T06:54:12.197 回答
2

对我来说,在选择中使用哈希的最简单方法是:

哈希:

REVISION_TYPES={"S"=>"Stock", "T"=>"Traducción"}

在表格中:

select_tag(:revision_type,options_for_select(REVISION_TYPES.invert.to_a))
于 2016-11-08T16:11:37.443 回答
1

您可以options_for_select用于此目的。它需要一个二维数组。你可以像这样转换你的哈希:

data = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
data_for_select = data.each { |hash| [hash['name'], hash['id']] }
options_for_select(data_for_select)

作为 的旁注options_from_collection_for_select,它与对象结合使用。它遍历对象并为标签发送一条消息,为id发送一条消息。

于 2012-12-31T01:11:00.967 回答
0

好的,我最终想出了一个可行的解决方案,尽管它可能不是最好的。

$ @array_of_hashes = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
=> [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
$ @formatted_array_of_hashes = @array_of_hashes.each.map{ |h| { h["name"] => h["id"] }}
=> [{"NameA" => "001"}, {"NameB" => "002"}]
$ @merged_hash = Hash[*@formatted_array_of_hashes.map(&:to_a).flatten]
=> {"NameA" => "001", "NameB" => "002"}

然后我能够创建一个选择字段

<%= select_tag 'model[field]', options_for_select(@merged_hash) %>

生成正确的标记

<select>
  <option value="001">NameA</option>
  <option value="002">NameB</option>
</select>

有点令人费解,但它的工作。我欢迎任何改进。

于 2013-01-04T15:30:25.753 回答
0

我不太确定为什么,但没有一个答案对我有用。也许是因为 Rails 5,所以我自己想出来了,我很乐意分享。它现在很漂亮,但效果很好。

这是我想与用户表关联的来自外部 API(管道驱动器)的哈希数组:

这是我的形式:

<%= form.collection_select(:id_user_pipedrive, Owner.all_id_name, :id, :name, :include_blank => '') %>

这是在我的假模型中:

UserPipedrive = Struct.new(:id, :name)
def self.all_id_name
  all["data"].map { |d| UserPipedrive.new(d["id"],d["name"]) }
end

希望它可以帮助某人。

于 2018-04-18T22:00:51.137 回答