我正在序列化存储在表中settings
字段中的哈希,并且希望能够在表单字段中编辑该哈希值。
class Template < ActiveRecord::Base
serialize :settings
end
但我只是做<%= f.text_area :settings %>
然后文本区域只显示序列化数据而不是哈希值。
如何在文本区域中显示哈希?
答案 0 :(得分: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
中删除整行模板表中的一行。如果涉及用户输入,请使用其他方法将字符串转换为哈希值。
答案 1 :(得分:2)
......或者你可以使用这样的东西(在模型中没有任何逻辑):
<% @template.settings.each do |name, value| %>
<div>
<%= label_tag name %>
<%= text_field_tag "template[settings][#{name}]", value %>
</div>
<% end %>
答案 2 :(得分:-2)
你应该使用像
这样的东西class Template < ActiveRecord::Base
serialize :settings, Hash
end