"bestbuy", "long"=>"bes-6ren">
gpt4 book ai didi

ruby-on-rails - 如何在表单 textarea 中编辑序列化的哈希列

转载 作者:行者123 更新时间:2023-12-04 06:17:35 26 4
gpt4 key购买 nike

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

class Company < ActiveRecord::Base
serialize :names

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

目前在我的 company#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

当我尝试保存时它会出错:

ActiveRecord::SerializationTypeMismatch in Admin::CompaniesController#update
属性应该是一个哈希值,但它是一个字符串

最佳答案

您可以使用原始 SQL 手动在数据库中乱搞,但如果您还不知道自己在做什么,我不会推荐它。一个推论是,除非您已经确切地知道自己在做什么,否则您不应该弄乱数据库的 YAML 版本。

相反,自己将数据转换为 YAML:

@names = m.names.to_yaml

然后东西 @names进入您的 <textarea> .然后要保存编辑的 YAML,将其解析回 Hash 并将其传递给您的模型:
m.names = YAML.parse(params[:names])

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

为了安全起见,您应该指定您的 names应该是模型中的哈希:
serialize :names, Hash

我不是 serialize 的忠实粉丝所以我通常建议不要使用它;然而,如果你打算使用它,你应该总是指定 class_name以使其使用更安全。

您当前的方法是放置 to_s将您的 Hash 版本放入 <textarea> :
{"short"=>"bestbuy", "long"=>"bestbuy ltd."}

那是一个字符串,而不是一个哈希;它可能看起来像一个哈希,但 HTML 不知道 Ruby 哈希是什么,所以它只是一个字符串。然后你读回它并将其放入 names然后 YAML 化(作为字符串)到这个:
--- ! '{"short"=>"bestbuy", "long"=>"bestbuy ltd."}'

那是 YAML 中的一个字符串,一个看起来很像 Hash 但实际上是一个字符串的字符串。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com