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

时间:2011-06-30 19:22:34

标签: ruby-on-rails serialization hash

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

class Template < ActiveRecord::Base
  serialize :settings
end

但我只是做<%= f.text_area :settings %>然后文本区域只显示序列化数据而不是哈希值。

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

3 个答案:

答案 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