2012-12-31 23 views
15

在Rails 3.2应用程序中,我试图添加一个从外部API调用中获取数据的选择字段。这些数据返回哈希的数组:如何使用散列数组填充select_tag?

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

如何使用这些数据来构建一个选择栏,看起来像:

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

编辑:

感谢的建议下面我已经试过如下:

答:

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

给出了一个错误:

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

B:

<%= 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"} 

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

+0

也许会有帮助吗? – jxpx777

+0

谢谢@ jxpx777,我已经看过这个。如果我使用这个解决方案,我会得到'未定义的方法'last''。我认为我的问题在于其他地方 –

+0

啊,因为它是一个哈希,参数是调用select和select的值的方法。尝试options_for_select with @ hash.to_a http://apidock.com/rails/v3.2.8/ActionView/Helpers/FormOptionsHelper/options_for_select – jxpx777

回答

7

一个更好的办法来做到这一点的只有一个命令:

<%= 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"]] 
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,它与物体的组合使用。它遍历对象并为标签发送消息,为标识发送消息。

+0

感谢@Yves,'data_for_select'行对散列没有任何影响。任何其他想法? –

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> 

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

+0

当你看到我的答案时,改变你的代码,你做的事情很长而且没有必要! – user2503775

35

如果您有散列的数组是这样的:

@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'] ] }) 

其完成:-)。

+1

Yeap ...好,很短,工作很棒...Ευχαριστώ。 –

+0

谢谢尼科斯,你可以请包括一个链接todocumentation。会非常有帮助,谢谢 –

1

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

散列:

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

在形式:

select_tag(:revision_type,options_for_select(REVISION_TYPES.invert.to_a)) 
+0

感谢@albert,但问题是关于一组哈希 –