我在索引视图中有一个表单,我在其中创建了多个复选框。每个条目一个复选框。这看起来像这样:
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
由于
答案 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
,他们会为您处理这种细微差别。