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
属性应该是哈希值,但实际上是字符串
我自己的问题的迟到答案:
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 字符串,以便用户可以编辑它。
| 归档时间: |
|
| 查看次数: |
4411 次 |
| 最近记录: |