Подтвердить что ты не робот

Как получить пустые флажки для передачи как false в params

У меня есть форма, которая является формой пользователя обновления, где некоторые элементы являются флажками. Я хочу, чтобы true передавался параметрам, если они были отмечены (это работает) и false, чтобы перейти к параметрам, если они не отмечены (не работают). Непроверенные элементы даже не отправляются в параметры. Как я могу сделать непроверенный элемент пройденным как false?

Форма

<%= 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
4b9b3361

Ответ 1

Вам нужно поместить скрытый тег поля перед каждым флажком с пустым значением, например:

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

Тогда форма знает, что для заполнения этого поля нужно пустое значение, если ничего не выбрано.

Ответ 2

Посмотрите на него

Основная идея поместить скрытое поле перед флажком. Когда поле формы будет отправлено, будут проанализированы: если флажок установлен - будет передано его значение, иначе значение скрытого поля

Например, smth, подобный этому (NOT testes)

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

Ответ 3

Если у кого есть тип столбца boolean и с помощью check_box_tag, то посмотрите на это. Это сработало для меня. <%= hidden_field_tag :basketball, 'false' %> <%= check_box_tag :basketball, true, is_checked? %>

Ответ 4

Кажется, что вы можете передать значение. См. Следующий код:

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

Ответ 5

Проблема заключается в том, что перед использованием флажка вы используете скрытый атрибут и даете ему такую ​​же ссылку:

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

Затем, если вы хотите сделать какой-либо тип динамического действия для атрибута, скажем, как $("#basketball").removeAttr("checked"), он будет нацелен на первый экземпляр $("#basketball"), который в этом случае является скрытым объектом.

То, что я закончил в моей реализации, заключалось в том, чтобы добавить значение по умолчанию false в мои флажки, так как моя установка по умолчанию должна была быть снята. Затем в моем jquery я обнаружил изменение элементов флажка и схватил идентификатор этого флажка. Когда обнаружено изменение, я оценил свойство checked для true или false и соответствующим образом присвоил атрибут value.

$(".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");
  }
});