在表单中编辑序列化哈希?
我正在序列化存储在表中的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