我正在渲染一个带有序列化属性的表单。属性序列化在正常使用情况下工作正常,但现在我正在尝试序列化哈希。视图代码如下所示
<%= @item.seasonality_of_sales_pct.each do |key, value| %>
<%= eval("f.label :'seasonality_of_sales_pct[:#{key}]'") %>
<%= eval("f.text_field :'seasonality_of_sales_pct[:#{key}]'") %>
<% end %>
我得到的错误是undefined method 'seasonality_of_sales_pct[:January]' for #<Item:0x007f01083edd38>
。但是,抛出错误的行是第二个eval
。第一个eval
评估得很好。我很困惑为什么会发生这种情况。
在控制器中,我正在设置如下所示的属性
@item.seasonality_of_sales_pct = {January: nil, February: nil, March: nil, September: nil}
评论中可能回答的另一个问题是:这段代码有多糟糕?我不确定rails社区对这样的元编程感觉如何。这样做有点伤害我,但似乎大部分时间都在工作
答案 0 :(得分:0)
当您使用form_for
然后使用f.text_field :some_attribute_name
时,您构建表单的对象(在您的情况下为@item
})会有一个名为some_attribute_name
的属性。< / p>
您收到此错误是因为@item
没有名为seasonality_of_sales_pct[:January]
我还要指出,没有理由在您的表单中使用eval
,这是一个严重的安全风险,因为可以注入代码。
答案 1 :(得分:0)
我想要比Khaled的答案更彻底,这是正确的。第一个eval语句没有导致错误的原因是因为f.label
并不关心你给它的是什么。 <%= f.label :fake_stuff %>
只会创建一个名为Fake Stuff
的标签。我仍然不太确定为什么该属性不起作用。如果我有f.text_field :seasonality_of_sales_pct
,我会得到一个充满哈希的文本框。此外,我得到了标签来显示正确的值。
我绝对不需要在这里使用evals(我希望它只是片刻的弱点)。只是做
<%= f.text_field :'seasonality_of_sales_pct[:"#{key}"]' %>