3

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

4 回答 4

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) 中所述,重复键将不起作用。与另一个字段具有相同标签的字段是不好的。

于 2013-04-11T13:54:59.530 回答
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 哈希中获取值,类似于您对 JavaScript 对象(例如field.label)使用点语法的方式。不幸的是,这不适用于 Ruby。我希望它这样做,因为它看起来很干净。对于 Ruby 哈希,您必须使用索引,在这种情况下它是一个符号:field[:label]. 您的 ERB 代码将如下所示:

# template.erb
<% fields_with_values.each do |field| %>
  l: <%= field[:label] %>
  v: <%= field[:value] %>
<% end %>
于 2013-04-11T13:57:13.210 回答
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 方式或动态创建对象等。

于 2013-04-11T13:52:33.773 回答
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 %>

但是,假设标签是一家公司,价值是一封电子邮件。如果你有一个像

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

但是,很可能为此创建一个新类是过度工程,除非您将在代码中一遍又一遍地使用这个类。

于 2013-04-11T13:57:24.670 回答