【问题标题】:Serialized attributes not evaluating properly with form helpers使用表单助手无法正确评估序列化属性
【发布时间】:2013-01-09 20:24:28
【问题描述】:

我正在渲染一个带有序列化属性的表单。属性序列化在正常使用下工作正常,但现在我正在尝试序列化哈希。视图代码如下所示

<%= @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 #&lt;Item:0x007f01083edd38&gt;。但是,引发错误的行是第二个eval。第一个 eval 评估得很好。我很困惑为什么会发生这种情况。

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

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

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

【问题讨论】:

    标签: ruby-on-rails metaprogramming form-helpers


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么第一行的评价如何?另外,如果我将逻辑移到控制器中并将 html 呈现到我放入视图 (&lt;%= raw html %&gt;) 中的变量 (html = [LOOP]) 中,是否会减轻安全风险?或者有人还能将代码注入控制器吗?
    【解决方案2】:

    我想比 Khaled 的回答更彻底一点,这有点对。第一个 eval 语句没有导致错误的原因是因为f.label 不在乎你给它什么。 &lt;%= f.label :fake_stuff %&gt; 只会创建一个名为 Fake Stuff 的标签。我仍然不太确定为什么该属性不起作用。如果我有f.text_field :seasonality_of_sales_pct,我会得到一个充满我的哈希值的文本框。此外,我得到了显示正确值的标签。

    我绝对不需要在这里使用 evals(我希望这只是一时的软弱)。做吧

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多