如何使用哈希数组填充select_tag?
在Rails 3.2应用程序中,我正在尝试添加一个从外部API调用获取其数据的选择字段。 此数据作为哈希数组返回:
[{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
如何使用此数据构建一个类似于以下内容的选择字段:
NameA NameB
编辑:
感谢下面的建议,我尝试了以下内容:
A:
给出错误:
undefined method `name' for {"name"=>"NameA", "id"=>"001"}:Hash
B:
修复错误但生成错误的标记
"NameA", "id"=>"001"}"> {"name"=>"NameA", "id"=>"001"}
所以我认为我的问题是正确地格式化哈希数组,而且我不太了解操作哈希数组以找出如何做到这一点。
除非我完全关注这个方向,否则我认为这个问题的关键是在这个问题的顶部重新格式化数组给出:
{"NameA" =>"001", "NameB" =>"002"}
这有可能吗? 如果是这样,怎么样?
只在一个命令中执行此操作的更好方法:
<%= 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"]]
如果你有像这样的哈希数组:
@people = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
你可以使用options_for_select
helper和collect
方法,如下所示:
= select_tag "people", options_for_select(@people.collect {|p| [ p['name'], p['id'] ] })
它完成了:-)。
对我来说,选择哈希的最简单方法是:
哈希:
REVISION_TYPES={"S"=>"Stock", "T"=>"Traducción"}
forms如下:
select_tag(:revision_type,options_for_select(REVISION_TYPES.invert.to_a))
您可以使用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的消息。
好吧,我最终想出了一个有效的解决方案,尽管它可能不是最好的。
$ @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) %>
生成正确的标记
有点费解,但它的工作。 我欢迎任何改进。
我不确定为什么,但没有一个答案对我有用。 也许是因为Rails 5,所以我自己想出来,我很乐意分享。 它现在很漂亮,但效果很好。
它是来自外部API(Pipedrive)的哈希数组,我想与用户的表关联:
这是我的forms:
<%= 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
希望它可以帮到某人。