Rails复选框和序列化数据

时间:2011-05-19 18:36:31

标签: ruby-on-rails ruby forms serialization checkbox

我正在试图弄清楚什么是让复选框正确显示其当前状态的最佳方式。这就是我的形式

<%= form_for @user, :url => user_notification_preferences_path(@user), :method => :put do |f| %>
  <%= f.fields_for :notification_preferences, @user.notification_preferences do |p| %>

    <%= p.check_box :notify_on_friend_post %>

    <%= p.check_box :notify_on_friend_post %>

    <%= p.check_box :notify_on_friend_request %>

    <%= p.check_box :notify_on_friend_comment %>
  <% end %>
  <%= f.submit %>
<% end %>

notification_preferences是我的用户模型上的序列化哈希

class User < ActiveRecord::Base
  serialize :notification_preferences, Hash

我的问题无论我尝试什么,我都无法通过复选框来反映哈希值的现有状态。 IE,如果散列已经包含:notify_on_friend_post =&gt; 1,然后应检查该值的复选框。

表单发布的数据很好,我也可以更新我的模型。

更新

使用check_box_tag我可以让它工作

<%= p.hidden_field :notify_on_friend_post, :value => "0" %>
<%= check_box_tag "user[notification_preferences][notify_on_friend_post]", "1", @user.notification_preferences[:notify_on_friend_post] == "1" ? true : false %>

丑陋但工作,仍希望我遗漏一些非常明显的东西

2 个答案:

答案 0 :(得分:2)

我遇到了这个问题并以更简单的方式解决了它。

<%= form_for @user do |f| %>

  <%= f.fields_for :notifications, @user.notifications do |n| %>
    <%= n.check_box :new_task, checked: @user.notifications[:new_task] == "1" %>
  <% end %>

  <%= f.submit %>
<% end %>

通过这种方式,你可以让check_box的魔力发挥作用,而不需要有一个hidden_​​field,因为Rails会为你提供一个。仍然不确定为什么你需要一个“检查”字段,但没有一个似乎不起作用。

答案 1 :(得分:1)

尝试这样的事情:

 <%= form_for @user, :url => user_notification_preferences_path(@user), :method => :put do |f| %>

  <%= check_box_tag "user[notification_preferences][]", :notify_on_friend_post, @user.notification_preferences.try(notify_on_friend_post) %>

 <%= f.submit %>
<% end %>