2013-01-09 36 views
0

我使用序列化属性呈现表单。属性序列化在正常使用情况下工作正常,但现在我试图序列化一个散列。查看代码看起来像下面的序列化属性没有用表单助手正确评估

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

我想要比哈立德的回答更彻底,这是正确的。第一个评估声明不会导致错误的原因是因为f.label并不关心你给它的东西。 <%= f.label :fake_stuff %>只会创建一个名为Fake Stuff的标签。我仍然不确定该属性不起作用的原因。如果我有f.text_field :seasonality_of_sales_pct,我收到了一个填充我的散列的文本框。此外,我得到的标签显示正确的值。

我绝对不需要在这里使用evals(我希望它只是一个弱点)。只要做

<%= f.text_field :'seasonality_of_sales_pct[:"#{key}"]' %> 
0

当您使用form_for然后用f.text_field :some_attribute_name,那么你正在建设的形式(在你的情况@item)玉米粥对象有一个属性命名some_attribute_name

你得到这个错误,因为@item没有指定属性或方法seasonality_of_sales_pct[:January]

我还要指出的是,没有理由在您的形式使用eval,这是一个严重的安全风险,因为代码可以被注入。

+0

那么第一行如何评估?此外,如果我将逻辑移入控制器并将html呈现给我放入视图('<%= raw html%>')的变量('html = [LOOP]'),那么安全风险是否会减轻?或者有人仍然可以将代码注入控制器? –