ruby-on-rails - 编辑表单中的序列化哈希?

标签 ruby-on-rails serialization hash

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

class Template < ActiveRecord::Base
  serialize :settings
end

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

如何让散列显示在文本区域?

最佳答案

也许可以为您的模型设置另一个访问器。

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 .如果涉及用户输入,请使用不同的方法将字符串转换为散列。

关于ruby-on-rails - 编辑表单中的序列化哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6539991/

相关文章:

ruby-on-rails - Rails ActiveRecord - 验证命名范围的唯一性(不是像其他列那样的范围)

java - 将A类序列化为B类java

java - Fail during start Tomcat v9.0 CDI 注释

c - C 中的哈希函数

javascript - 如何将 JS 对象转换为数组

c# - 在 C# 中可靠地重现在 PHP 中实现的遗留密码哈希方法

ruby-on-rails - 如何为 Rails 中的文件上传创建集成测试?

ruby-on-rails - Aws::CognitoIdentity::Errors::NotAuthorizedException 异常:无效的登录 token

ruby-on-rails - 使 Rails 类属性不可访问 - Rails 教程第 9 章,练习 1

java - 如何将 Java Map 序列化为 PHP 的数组序列化格式