获取控制器中复选框的选中状态

时间:2014-06-03 19:04:09

标签: ruby-on-rails checkbox

我在索引视图中有一个表单,我在其中创建了多个复选框。每个条目一个复选框。这看起来像这样:

index.html.erb

<%= form_for :user, url: usersupdate_path() do |f| %>
    <%= render @users %>
    <%= f.submit 'test', :class => 'btn btn-primary' %>
<% end %>

_user.html.erb

<%= check_box_tag "checked[#{user.id}]","#{user.id}",true %>

说明 使用表单我想让管理员取消选中用户 - 我希望将这些用户发送给控制器并更新其属性。

只有两个问题:

1)我必须刷新网站,直到我可以将表单发送给控制器 - 我不知道为什么

2)当我打印数组时,它看起来像这样:

{"1"=>"1", "2"=>"2", "4"=>"4"}

用户3未经我检查。

我想要的是这样的:

{"1"=>"true", "2"=>"true", "3"=>"false", "4"=>"true"}

但是如何将复选框的checked值发送给控制器?

在我的控制器中,我现在只做这个:

def update
    flash[:success] = params[:checked]
    redirect_to root_path
end

由于

1 个答案:

答案 0 :(得分:4)

在发送表单数据时,浏览器不会序列化未选中的复选框,因此如果未选中,则永远不会发送。

您通常可以通过以下两种方式解决此问题。让您的操作足够智能,将“缺失”值视为“未选中”,或在每个复选框前添加隐藏字段:

 <%= hidden_field_tag "checked[#{user.id}]", "false" %>
 <%= check_box_tag "checked[#{user.id}]","#{user.id}", true %>

对于真值,check_box_tag的第二个参数是您希望复选框具有的值,因此您可以将其更改为:

 <%= hidden_field_tag "checked[#{user.id}]", "false" %>
 <%= check_box_tag "checked[#{user.id}]","true", true %>

它应该做你想要的。

请注意,如果您使用FormBuilder,他们会为您处理这种细微差别。