2013-01-09 30 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]'),那麼安全風險是否會減輕?或者有人仍然可以將代碼注入控制器? –