ruby-on-rails – 如何在textarea格式中编辑序列化哈希列

ruby-on-rails – 如何在textarea格式中编辑序列化哈希列,第1张

概述我在公司模型中有一个序列化列: class Company < ActiveRecord::Base serialize :names 理想情况下,我希望它在数据库中存储这样的不同名称: ---short: bestbuylong: bestbuy ltd. 目前在我的公司#edit页面中,我有一个文本区域: <%= f.text_area :names %> 如果我在数据库中有YAML, 我在公司模型中有一个序列化列:

class Company < ActiveRecord::Base  serialize :names

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

---short: bestbuylong: bestbuy ltd.

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

<%= f.text_area :names %>

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

{"short"=>"bestbuy","long"=>"bestbuy ltd."}

但是,当我提交它时,它在数据库中成为:

--- ! '{"short"=>"bestbuy","long"=>"bestbuy ltd."}'

我怎样才能使textarea显示YAML以供编辑人员编辑?

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

更新

如果我像这样强制列类型为Hash:

serialize :names,Hash

我尝试保存时会出错:

admin :: CompanIEsController#update中的ActiveRecord :: SerializationTypeMismatch
属性应该是哈希,但是是一个字符串

解决方法 您可以使用原始sql手动扫描数据库,但如果您还不知道自己在做什么,我不会推荐它.一个必然结果是你不应该乱用数据库的YAML版本,除非你已经确切地知道你正在做什么.

而是自己将数据转换为YAML:

@names = m.names.to_yaml

然后将@names填入您的< textarea>.然后保存已编辑的YAML,将其解析回Hash并将其移交给您的模型:

m.names = YAML.parse(params[:names])# Or modify `params` in-placeparams[:name] = YAML.load(params[:names])# then stuff `params` into `m` as usual

为了安全起见,您应该指定您的名称应该是模型中的哈希值:

serialize :names,Hash

我不是serialize的忠实粉丝所以我通常建议不要使用它;但是,如果要使用它,则应始终指定class_name以使其更安全.

您当前的方法是将Hash的to_s版本放入< textarea>:

{"short"=>"bestbuy","long"=>"bestbuy ltd."}

那是一个字符串,而不是哈希;它可能看起来像一个哈希,但HTML不知道Ruby Hash是什么,所以它只是一个字符串.然后你读回来并把它放入名称,然后YAMlifIEs(作为一个字符串)到这个:

--- ! '{"short"=>"bestbuy","long"=>"bestbuy ltd."}'

这是YAML中的一个字符串,这个字符串看起来很像哈希,但仍然是一个字符串.

总结

以上是内存溢出为你收集整理的ruby-on-rails – 如何在textarea格式中编辑序列化哈希列全部内容,希望文章能够帮你解决ruby-on-rails – 如何在textarea格式中编辑序列化哈希列所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1272786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存