【问题标题】:rails form fields_for serialize hashrails form fields_for 序列化哈希
【发布时间】:2014-03-08 01:18:59
【问题描述】:

我需要为评论表单创建一个检查列表,以便用户通知评论。

我有一个评论模型,我有一个名为 comment_meta 的列,我想将其存储为序列化哈希。

我的评论表单有一个 fields_for comment_meta 示例;

<%= f.fields_for :comment_meta do |comment_form| %>
<%= comment_form.check_box(contact.id) %>
<% end %>

传递的参数是"comment_meta"=&gt;{"155"=&gt;"0", "156"=&gt;"1", "157"=&gt;"0"}}, 但我的数据库正在保存一个空哈希。

comment_meta 的字段类型是文本。

有办法保存吗?

【问题讨论】:

    标签: serialization hash ruby-on-rails-4


    【解决方案1】:

    您的 comment_meta 哈希似乎分别是 id 和布尔值的“键值对”。如果这是真的,那么您最好使用 users_comment_metas 'through' 表。

    您将从重组到此方法中受益,因为:

    1. db 索引速度很快 - 与 db 之间的 rails 哈希序列化/解析速度很慢(除非您使用 postgres 的 h-store,但那是另一回事了)
    2. 当开发人员试图显示可读报告时,关于数据库中所有数据的动态报告将更加直观/可查询(这至少在我的工作中非常重要)。
    3. 您使用 Rails 的内置表单助手的目标会容易得多。

    如果您真的想采用您建议的哈希路由,可能会有多种因素阻止它保存。以下是我将如何进行故障排除:

    • 首先确保您的 Comment 模型中有“serialize comment_meta, Hash”行。
    • 出于测试目的,删除您可能在评论模型中进行的所有验证。
    • 现在,在您的控制器创建和/或更新中键入“调试器”(不带引号) 在您的 cmets_controller (或您的控制器)中的操作 从表格中请求)
    • 当您在终端中点击调试器语句时,键入单词 'eval comment_params' 检查您提交的评论参数(我假设您使用的是强参数 gem,因为您在此帖子的标签中输入了 'ruby-on-rails-4')。

    • 哈希应该具有您上面建议的这种结构(如果看起来不同, 您的表单有问题,或者您的强大参数设置不正确,更多信息here):

    "comment_meta"=>{"155"=>"0", "156"=>"1", "157"=>"0"}

    • 键入 'n' 直到您通过了使用参数初始化新对象的行

      @comment = Comment.new(comment_params)

    • 现在输入“eval @comment”来查看您的新对象,然后输入“eval @comment.comment_meta”来查看是否正在存储哈希。如果它返回 nil,则输入 'eval @comment.valid?'。如果返回 true,则输入 @comment.errors 以查看问题所在并进行相应修复。

      如果所有其他方法都失败了,请确保您可以手动将任何给定的哈希分配给您的 rails 控制台中新 Comment 对象的 comment_meta:

      @comment = Comment.new() @comment.comment_meta = {"test"=>"1"} @comment.save!

    我希望这能让你走上正轨。

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 2013-10-03
      • 2012-01-28
      • 1970-01-01
      • 2014-09-04
      • 2018-01-25
      • 2012-10-28
      • 2013-07-03
      • 2012-05-28
      相关资源
      最近更新 更多