我正在试图弄清楚什么是让复选框正确显示其当前状态的最佳方式。这就是我的形式
<%= 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 %>
丑陋但工作,仍希望我遗漏一些非常明显的东西
答案 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 %>