2011-06-30 20 views
3

我正在序列化存儲在表中的settings字段中的散列,並且希望能夠在表單字段中編輯該散列。編輯表單中的序列化哈希?

class Template < ActiveRecord::Base 
    serialize :settings 
end 

但我只是做<%= f.text_area :settings %>然後文本區域只顯示序列化的數據,而不是散列。

我怎樣才能讓哈希顯示在文本區域?

+0

你有什麼期望在文字區域看?就像'{:foo =>'bar'}'?一個問題是,當你提交表單時,設置字段將被序列化爲一個字符串,而不是散列,除非你的應用程序添加了一些邏輯。邏輯應該最好放在模型中。 –

+0

正確。我想看看'{:foo =>'bar'}'。 – Shpigford

回答

4

也許設立另一個訪問你的模型是可行的。

class Template < ActiveRecord::Base 
    serialize :settings 
    attr_accessor :settings_edit 

    before_save :handle_settings_edit, :if => lambda {|template| template.settings_edit.present? } 

    def settings_edit 
    read_attribute(:settings).inspect # should display your hash like you want 
    end 

    protected 
    def handle_settings_edit 
     # You may want to perform eval in your validations instead of in a 
     # before_save callback, so that you can show errors on your form. 
     begin 
     self.settings = eval(settings_edit) 
     rescue SyntaxError => e 
     self.settings = settings_edit 
     end 
    end 
end 

然後在您的表格中使用<%= f.text_area :settings_edit %>

我還沒有測試過這些代碼,但理論上它應該可以工作。祝你好運!

警告:使用這樣的eval是非常危險的,在這個例子中,用戶可以在編輯框Template.destroy_all中用一行刪除整個模板表。如果涉及用戶輸入,請使用其他方法將字符串轉換爲散列。

+0

Spot的內容!完美的作品。 – Shpigford

+0

其實......這似乎沒有工作。當我編輯表單並提交(更新)時,它不會將更改保存到'settings'中......它保留了以前的數據。 – Shpigford

+0

做了些什麼改變?你使用'attr_accessible'嗎?如果是這樣,請確保您允許對'settings_edit'進行批量分配。 –

-2

你應該使用類似

class Template < ActiveRecord::Base 
    serialize :settings, Hash 
end 
+0

不改變text_area – Shpigford

2

...或者你可以使用(在模型沒有任何邏輯)是這樣的:

​​
+0

是的,這可以工作,但是您需要更多的邏輯來添加一個新的鍵/值對設置哈希。 –

+0

是的,實際上它會非常複雜:)所以如果你有預定義的配置密鑰並且不想要添加或移除密鑰 –