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>。ただし、エラーをスローしている行は 2 番目evalです。最初のものevalは問題なく評価されます。なぜこれが起こっているのか、私は困惑しています。

コントローラーでは、次のような属性を設定しています

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

コメントで答えられるかもしれないもう 1 つの質問は、次のとおりです。このコードの臭いはどの程度ですか? 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、ハッシュでいっぱいのテキスト ボックスが表示されます。また、正しい値を表示するラベルを取得しました。

ここで eval を使用する必要はまったくありませんでした (ほんの一瞬の弱点だったといいのですが)。やるだけ

<%= f.text_field :'seasonality_of_sales_pct[:"#{key}"]' %>
于 2013-01-11T06:46:55.860 に答える