如何在erb模板中呈现数组数组的最佳方法?

时间:2013-04-11 13:31:08

标签: ruby-on-rails ruby object sinatra erb

我有一个数组[["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

4 个答案:

答案 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)

L:   五:

我愿意

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 %>

然而,最有可能为此创建一个新类是过度工程,除非你在代码中反复使用这个类。