Ruby on rails 使用表单帮助程序无法正确计算序列化属性

Ruby on rails 使用表单帮助程序无法正确计算序列化属性,ruby-on-rails,metaprogramming,form-helpers,Ruby On Rails,Metaprogramming,Form Helpers,我正在呈现一个具有序列化属性的表单。属性序列化在正常使用下可以正常工作,但现在我正在尝试序列化散列。视图代码如下所示 <%= @item.seasonality_of_sales_pct.each do |key, value| %> <%= eval("f.label :'seasonality_of_sales_pct[:#{key}]'") %> <%= eval("f.text_field :'seasonality_of_sale

我正在呈现一个具有序列化属性的表单。属性序列化在正常使用下可以正常工作,但现在我正在尝试序列化散列。视图代码如下所示

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

另一个可能在评论中得到回答的问题是:这段代码有多糟糕?我不确定rails社区对这样的元编程有何感受。做这件事让我有点痛苦,但在大多数情况下,当你使用
form\u for
然后使用
f.text\u字段:some\u attribute\u name
那么你为其构建表单的对象(在你的例子中是
@item
)必须有一个名为
some\u attribute\u name
的属性

之所以出现此错误,是因为
@item
没有名为
销售季节性\u pct[:一月]


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

我想比Khaled的回答更彻底一点,这是一种正确的回答。第一个eval语句没有导致错误的原因是因为
f.label
不在乎您给它什么
将创建一个名为
Fake Stuff
的标签。我仍然不太清楚为什么该属性不起作用。如果我有
f.text\u字段:销售季节性\u pct
,我会得到一个装满哈希的文本框。此外,我还获得了显示正确值的标签

我完全不需要在这里使用evals(我希望这只是一个软弱的时刻)。照办

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

那么第一行是如何计算的?此外,如果我将逻辑移到控制器中,并将html呈现为我放入视图(
)的变量(
html=[LOOP]
),安全风险是否会降低?或者有人仍然可以将代码注入控制器吗?
<%= f.text_field :'seasonality_of_sales_pct[:"#{key}"]' %>