Как получить пустые флажки для передачи как 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
Ответы
Ответ 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");
}
});