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>. 但是,引发错误的行是 second eval。第一个eval评估就好了。我很困惑为什么会发生这种情况。

在控制器中,我正在设置如下属性

@item.seasonality_of_sales_pct = {January: nil, February: nil, March: nil, September: nil}

另一个可以在评论中回答的问题是:这段代码有多难闻?我不确定 Rails 社区对这样的元编程有何看法。这样做有点伤害我,但似乎大部分时间都有效

4

2 回答 2

0

当您使用form_for然后使用时f.text_field :some_attribute_name,您正在为(在您的情况下@item)构建表单的对象必须具有名为some_attribute_name.

您收到此错误是因为@item没有命名的属性或方法seasonality_of_sales_pct[:January]

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

于 2013-01-09T20:40:14.543 回答
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}"]' %>
于 2013-01-11T06:46:55.860 回答