rails form fields_for serialize hash

时间:2014-03-08 01:18:59

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

我需要为评论表单创建一个检查表,用户可以在其上通知评论。

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

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

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

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

comment_meta的字段类型是文本。

有没有办法保存?

1 个答案:

答案 0 :(得分:1)

您的comment_meta哈希似乎是一个&#39;键值对&#39;分别是ids和布尔值。如果这是真的,那么你可能最好使用users_comment_metas&#39;通过&#39;表

您将受益于重组此方法,因为:

  1. db索引很快 - 对数据库进行rails散列/解析很慢(除非你使用postgres的h-store,但那是另一个故事)
  2. 作为开发人员尝试显示可读报告(至少在我的工作中非常重要),动态报告数据库中的所有数据将更加直观/可查询。
  3. 您使用Rails的目标&#39;内置表单助手会更容易。
  4. 如果你真的想要去你所建议的哈希路线,可能有很多事情阻止它保存。以下是我要排除故障的方法:

    • 首先确保你有一行&#39;序列化comment_meta,Hash&#39;在你的评论模型中。
    • 删除评论模型中可能出于测试目的的所有验证。
    • 现在,输入&#39; debugger&#39;您的控制器中的(没有引号)创建和/或更新 你的comments_controller(或你的控制器)中的动作 从表格中请求)
    • 当您在终端中点击调试器语句时,请键入单词 &#39; eval comment_params&#39;检查您提交的评论参数(我假设您正在使用强参数gem,看到您在此帖子的标签中键入&#39; ruby​​-on-rails-4&#39;)< / p>

    • 哈希应具有上述建议的结构(如果它看起来不同, 您的表单中存在错误,或者您的参数设置不正确,更多信息here):

      

    &#34; comment_meta&#34; =&gt; {&#34; 155&#34; =&gt;&#34; 0&#34;,&#34; 156&#34; =&gt;&#34; 1&#34;,&#34; 157&#34; =&gt;&#34; 0&#34;}

    • 输入&#39; n&#39;直到您通过使用参数

      初始化新对象的行

      @comment = Comment.new(comment_params)

    • 现在输入&#39; eval @ comment&#39;要查看新对象,请键入&#39; eval @ comment.comment_meta&#39;查看是否存储了哈希。如果它返回nil,则输入&#39; eval @ comment.valid?&#39;。如果它返回true,则输入@ comment.errors以查看错误,并相应地修复。

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

      @comment = Comment.new() @ comment.comment_meta = {&#34; test&#34; =&gt;&#34; 1&#34;} @ comment.save!

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