帮助复选框

时间:2010-11-22 12:30:39

标签: ruby-on-rails

当用户提交时未选中任何框。我需要我的ODM(Mongoid)来适当地更新记录。

遇到一些麻烦:

  <% Notification.all.each do |notification| %>
    <li>
      <%= check_box_tag 'user[notification_ids][]', notification.id, @user.notifications.include?(notification) %>
      <%= label_tag notification.description %>
    </li>
  <% end %>

doc表示check_box帮助器放入隐藏的输入。隐藏字段具有相同的名称,其属性模仿未选中的复选框。但是,用上面的代码。我正在经历一个循环。这有点不同。

我试过了:

<%= check_box('user_notification_ids_', '', options = {:index => notification.id, :checked => @user.notifications.include?(notification)}, checked_value = "1", unchecked_value = "0") %>

但每当我提交时,我都会: 非法的ObjectId格式

或者我应该手动为notification_ids创建隐藏标记吗?类似的东西:

<%= hidden_field_tag 'user[notification_ids][]', '[]' %>

希望听到您的反馈意见

2 个答案:

答案 0 :(得分:1)

check_box_tag不会生成任何隐藏字段。 check_box可以,但考虑到你的情况,我认为使用check_box_tag更合适,因为check_box方法主要用于布尔字段。这是一种方法。

<%= hidden_field_tag 'user[notification_ids][]' %>
<% Notification.all.each do |notification| %>
  <li>
    <%= check_box_tag 'user[notification_ids][]', notification.id, @user.notifications.include?(notification) %>
    <%= label_tag notification.description %>
  </li>
<% end %>

提交表单时,选中了ID 2和3的通知复选框,params[:user]的值为{ "notification_ids" => ["", "2", "3"] }。如果未选中任何内容,则params[:user]{"notification_ids"=>[""]},这将清除用户的通知。这有效,因为empty string is ignored by ActiveRecord。从这里开始,我们可以使用通常的@user.update_attributes(params[:user])来更新用户模型。

答案 1 :(得分:1)

使用您包含的第一个循环。它看起来更简单,看起来它做同样的事情。

如果我正确理解了您的第一句话,那么当您取消选中所有复选框时,听起来您没有看到用户的通知更新为无。如果未选中复选框,则浏览器不会发回该参数。它只是不会包含在params中,所以当您执行以下操作时:

@user.update_attributes(params[:user])

...通知不会更新。在您的控制器中,执行此操作以确保为params[:user][:notifications]设置了一些内容:

params[:user][:notifications] ||= []

如果它不存在和/或那里没有值,这将把它设置为一个空数组。这可确保update_attributes将其设置为none / empty。