我有一个数组[["Company Name", "Field6"], ["Email", "Field5"]]
从该数组中我创建了带有值的字段数组:
[
[{:label=>"Company Name", :value=>"gfdgfd"}],
[{:label=>"Email", :value=>"gfdgfd@gfd.pl"}]
]
使用
fields = [["Company Name", "Field6"], ["Email", "Field5"]]
# first element in array is Label and second is param id
fields_with_values = fields.collect do |field|
[
label: field[0],
value: params[field[1]]
]
end
然后我想将标签和值传递给erb模板(类似):
# template.erb
<% fields_with_values.each do |field| %>
l: <%= field.label %>
v: <%= field.value %>
<% end %>
如何收集这些fields_with_values的最佳方式?也许我应该使用Object.new
答案 0 :(得分:5)
转而使用哈希。
fields = [["Company Name", "Field6"], ["Email", "Field5"]]
fields_with_values = Hash[*fields.flatten]
# => {"Company Name"=>"Field6", "Email"=>"Field5"}
在您的视图中,解析哈希:
<% fields_with_values.each do |label, value| %>
l: <%= label %>
v: <%= params[value.intern] %>
<% end %>
请注意,如果您的输入数组不均匀,这将会中断。一个没有价值的钥匙。
如下面的评论(+1)所述,重复的密钥不起作用。与另一个字段具有相同标签的字段不合适。
答案 1 :(得分:2)
fields = [["Company Name", "Field6"], ["Email", "Field5"]]
# first element in array is Label and second is param id
fields_with_values = fields.collect do |label, param_id|
# It looks like there is no need for a nested array here, so just return a Hash
{
label: label,
value: params[param_id]
}
end
#=> [{:label=>"Company Name", :value=>"gfdgfd"}, {:label=>"Email", :value=>"gfdgfd@gfd.pl"}]
看起来您正在尝试使用点语法从Ruby Hash中获取值,类似于您对JavaScript对象使用点语法的方式(例如field.label
)。不幸的是,这不适用于Ruby。我希望它能做到,因为它看起来很干净。对于Ruby Hash,您必须使用索引,在这种情况下是一个符号:field[:label]
。您的ERB代码如下所示:
# template.erb
<% fields_with_values.each do |field| %>
l: <%= field[:label] %>
v: <%= field[:value] %>
<% end %>
答案 2 :(得分:1)
最简单的方法是:
class Foo
attr_accessors :label, :value
def initialize (label, value)
@label = label
@value = value
end
end
fields_with_values = fields.map do |field|
Foo.new(field[0], params[field[1]])
end
从这里开始,您可以使用splat运算符创建更多Ruby方式,或者动态创建对象等等。
答案 3 :(得分:0)
我愿意
fields_with_values = fields.collect do |field|
{label: field[0], value: params[field[1]}
end
在视图中
<% fields_with_values.each do |field| %>
l: <%= field[:label] %>
v: <%= field[:value] %>
<% end %>
但是,让我们说label是公司,价值是电子邮件。如果您有类似
的课程class Company < SomethingOrNothing
attr_accessible :name, email
# methods here
end
你可以做到
@companies = fields.collect do |field|
Company.new(name: field[0], email: field[1])
end
然后
<% @companies.each do |company| %>
l: <%= comapny.name %>
v: <%= company.email %>
<% end %>
然而,最有可能为此创建一个新类是过度工程,除非你在代码中反复使用这个类。