在表单中编辑序列化哈希?

我正在序列化存储在表中的settings字段中的哈希,并希望能够在表单字段中编辑该哈希。

 class Template < ActiveRecord::Base serialize :settings end 

但我只是做然后文本区域只显示序列化数据而不是哈希值。

如何在文本区域中显示哈希值?

也许为您的模型设置另一个访问器将起作用。

 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删除整行模板表中的一行。 如果涉及用户输入,请使用其他方法将字符串转换为哈希。

……或者你可以使用这样的东西(在模型中没有任何逻辑):

 <% @template.settings.each do |name, value| %> 
<%= label_tag name %> <%= text_field_tag "template[settings][#{name}]", value %>
<% end %>

你应该使用类似的东西

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