ruby on rails - rails - Cómo obtener casillas en blanco para pasar como falso a params
form_with ruby on rails (5)
Tengo un formulario que es un formulario de actualización de usuario donde varios de los elementos son casillas de verificación. Quiero pasar el parámetro verdadero a los parámetros si está marcado (esto está funcionando) y falso para pasar a los parámetros si no está seleccionado (no funciona). Los elementos no verificados ni siquiera se envían a los params. ¿Cómo puedo hacer que un elemento sin marcar pase como falso?
Formar
<%= 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>
Controlador
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
Debe colocar una etiqueta de campo oculta antes de cada casilla de verificación con un valor vacío, por ejemplo:
<%= hidden_field_tag :basketball, '''' %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>
Entonces el formulario es consciente de que necesita llenar ese campo con un valor vacío si no se selecciona nada.
El problema es si usa un atributo oculto antes de una casilla de verificación y le da la misma referencia como esta:
<%= hidden_field_tag :basketball, false %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>
Entonces, si desea realizar cualquier tipo de acción dinámica en un atributo, digamos $("#basketball").removeAttr("checked")
apuntará a la primera instancia de $("#basketball")
que en este caso es el objeto escondido
Lo que terminé haciendo en mi implementación fue agregar un valor predeterminado de falso a mis casillas de verificación ya que mi configuración predeterminada debía ser desmarcada. Luego, en mi jquery, detecté un cambio en los elementos de la casilla de verificación y agarré la identificación de esa casilla de verificación. Cuando se detecta un cambio, evalué la propiedad marcada como verdadera o falsa y configuré el atributo de valor en consecuencia.
$(".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");
}
});
Cuando envío mi acción de formulario de método PUT, estoy actualizando el registro de la base de datos correctamente con el valor booleano, incluso si está en blanco.
Parece que puedes pasar el valor. Vea el siguiente código:
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
Si alguien tiene column boolean y usa check_box_tag, mira esto. Funcionó para mí <%= hidden_field_tag :basketball, ''false'' %> <%= check_box_tag :basketball, true, is_checked? %>
La idea principal es colocar el campo oculto antes de la casilla de verificación. Cuando se envía un formulario, los campos se analizarán: si la casilla de verificación está marcada, se pasará su valor, de lo contrario, el valor del campo oculto
Por ejemplo, algo así (NO testes)
<%= hidden_field_tag :basketball, false %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>