如何将空白复选框作为false传递给params

时间:2013-12-04 15:27:19

标签: ruby-on-rails checkbox ruby-on-rails-4

我有一个表单是一个更新用户表单,其中有几个元素是复选框。如果选中(这是正常工作),我想要传递给params,如果未选中(不工作),我希望传递给params。未经检查的项目甚至没有被发送到参数。如何使未经检查的项目通过为假?

表格

<%= form_tag user_url(@user), class: "form-signin", method: 'patch' do %>
 <h4>Please confirm your email.  We'll only email you if you have notifications.</h4>
  <%= email_field_tag :email, current_user.email %>
 <h4>Want to be notified when someone needs a player?  Choose which sports below.</h4>
  <%= check_box_tag :basketball, checked = true %> Basketball</br></br>
  <%= check_box_tag :indoor_volleyball, checked = true %> Indoor Volleyball</br></br>
  <%= check_box_tag :beach_volleyball, checked = true %> Beach Volleyball</br></br>
  <%= check_box_tag :soccer, checked = true %> Soccer</br></br>
  <%= check_box_tag :flag_football, checked = true %> Flag Football</br></br>
  <%= check_box_tag :hockey, checked = true %> Hockey</br></br>
  <%= check_box_tag :kickball, checked = true %> Kickball</br></br>
  <%= check_box_tag :softball, checked = true %> Softball
  <%= hidden_field_tag :user_id, :value => current_user.id %>
  <%= hidden_field_tag :user, :value => current_user %>
 <div>
  </br>
  <%= submit_tag "Submit", class:"btn btn-large btn-success" %>
 </div>
   

控制器

  def update
   respond_to do |format|
   if @user.update(update_params)
     format.html { redirect_to @user, notice: 'Updates were successful.' }
     format.json { head :no_content }
    else
     format.html { render action: 'edit' }
     format.json { render json: @user.errors, status: :unprocessable_entity }
    end
   end
  end

  def update_params
    params.permit(:email, :soccer, :softball, :beach_volleyball, :indoor_volleyball, :flag_football, :basketball, :hockey, :kickball)
  end

5 个答案:

答案 0 :(得分:77)

您需要在每个复选框前面放置一个隐藏的字段标记,并带有空值,例如:

<%= hidden_field_tag :basketball, '' %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>

然后表单知道如果没有选择任何内容,则需要使用空值填充该字段。

答案 1 :(得分:4)

如果有人有列类型布尔值并使用check_box_tag,那么看看这个。它对我有用。 <%= hidden_field_tag :basketball, 'false' %> <%= check_box_tag :basketball, true, is_checked? %>

答案 2 :(得分:3)

Look at it

在复选框之前放置隐藏字段的主要想法。提交表单时,将解析字段:如果选中复选框 - 将传递其值,否则隐藏字段的值

例如像这样的smth(不是睾丸)

<%= hidden_field_tag :basketball, false %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>

答案 3 :(得分:2)

问题是如果你在复选框之前使用隐藏属性并给它相同的引用,如下所示:

<%= hidden_field_tag :basketball, false %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>

然后,如果您想对属性执行任何类型的动态操作,例如$("#basketball").removeAttr("checked"),它将定位$("#basketball")的第一个实例,在这种情况下是隐藏对象。

我在实现中最终做的是在我的复选框中添加默认值false,因为我的默认设置是未选中的。然后在我的jquery中,我检测到复选框元素的更改并抓住该复选框的ID。检测到更改时,我将checked属性的值计算为true或false,并相应地设置value属性。

&#13;
&#13;
$(".checkbox").on('change', function(e) {
  var that;
  that = "#" + e.target.getAttribute("id");
  if ($(that).prop("checked") === true) {
    $(that).val("true");
  }
  if ($(that).prop("checked") === false) {
    return $(that).val("false");
  }
});
&#13;
&#13;
&#13;

当我提交我的PUT方法表单操作时,它正在使用布尔值正确更新数据库记录,即使它是空白的。

答案 4 :(得分:1)

您似乎可以传递该值。请参阅以下代码:

check_box_tag 'accept'
<input id="accept" name="accept" type="checkbox" value="1" />

check_box_tag 'rock', 'rock music'
<input id="rock" name="rock" type="checkbox" value="rock music" />

check_box_tag 'receive_email', 'yes', true
<input checked="checked" id="receive_email" name="receive_email" type="checkbox" value="yes" />

check_box_tag 'tos', 'yes', false, :class => 'accept_tos'
<input class="accept_tos" id="tos" name="tos" type="checkbox" value="yes" />

check_box_tag 'eula', 'accepted', false, :disabled => true
<input disabled="disabled" id="eula" name="eula" type="checkbox" value="accepted" />

http://apidock.com/rails/ActionView/Helpers/FormTagHelper/check_box_tag