如何在表单文本区域中编辑序列化哈希列

lul*_*ala 5 serialization ruby-on-rails ruby-on-rails-3

我在公司模型中有一个序列化列:

class Company < ActiveRecord::Base
  serialize :names
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望它在数据库中存储这样的不同名称:

---
short: bestbuy
long: bestbuy ltd.
Run Code Online (Sandbox Code Playgroud)

目前在我的公司#edit 页面中,我有一个文本区域:

<%= f.text_area :names %>
Run Code Online (Sandbox Code Playgroud)

如果数据库中有该 YAML,它将在浏览器中显示为:

{"short"=>"bestbuy", "long"=>"bestbuy ltd."}
Run Code Online (Sandbox Code Playgroud)

然而,当我提交它时,在数据库中它变成了:

--- ! '{"short"=>"bestbuy", "long"=>"bestbuy ltd."}'
Run Code Online (Sandbox Code Playgroud)

问题

我怎样才能让textarea显示YAML供编辑者编辑?

如何使数据库保存正确的 YAML,而不是 YAML 和 ruby​​ 哈希的混合?

更新

如果我强制列的类型Hash如下:

serialize :names, Hash
Run Code Online (Sandbox Code Playgroud)

当我尝试保存时会出现错误:

Admin::CompaniesController#update 中的 ActiveRecord::SerializationTypeMismatch
属性应该是哈希值,但实际上是字符串

lul*_*ala 0

我自己的问题的迟到答案:

class ConfigSerializer
  def self.load(i)
    if i.blank?
      {}
    else
      YAML.load(i)
    end
  end

  def self.dump(i)
    i = {} if i.blank?

    if i.is_a?(String) # Allow assigning an YAML string as input 
      i
    else
      YAML.dump(i)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

并在模型中

serialize :names, ConfigSerializer
Run Code Online (Sandbox Code Playgroud)

这样我就可以分配一个 YAML 字符串,它将按原样存储到数据库中。仅当从数据库加载时,它才会转换为哈希对象。

在视图中,我将 textarea 设置为具有原始 YAML 字符串,以便用户可以编辑它。