ruby-on-rails - multiple - check_box_tag onchange
¿Cómo puedo hacer check_box_tag para publicar un parámetro ''falso'' o ''0'' cuando no está marcado? (5)
Para las casillas de selección tipo array, también puede usar un hash:
= hidden_field_tag "ad_ids[#{ad.token}]" , false
= check_box_tag "ad_ids[#{ad.token}]" , true, true
Con la siguiente check_box_tag:
<%= check_box_tag ''object[boolean_attribute]'', 1, object.boolean_attribute %>
Puedo actualizar boolean_attribute en una sola dirección: de falso a verdadero.
Cuando no está marcada por defecto (porque object.boolean_attribute es falso) y lo compruebo y luego envío el formulario, se publica un parámetro: boolean_attribute => 1.
Pero , cuando intento actualizar de verdadero a falso, no se pasa ningún parámetro, por lo que el atributo boolean_attribute sigue siendo verdadero.
En otras palabras, cuando se marca por defecto (porque object.boolean_attribute es verdadero) y lo desactivo y luego envío el formulario, a: boolean_attribute => 0 no se publica.
¿Cómo puedo hacer que check_box_tag publique un parámetro: boolean_attribute => 0 cuando está desmarcado?
Desde la API no puedo determinar si hay alguna opción para aprobar fácilmente: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag
Gracias.
EDITAR
Por alguna razón que no puedo comprender, en mi código real (con una asociación de muchos a muchos anidada), hidden_field_tag no funciona.
<%= hidden_field_tag ''order[preparations_attributes][][cooked]'', nil %>
<%= check_box_tag ''order[preparations_attributes][][cooked]'', ''1'', preparation.cooked? %>
Ahora tengo el problema opuesto: puedo desmarcar la casilla de verificación y la preparación se actualiza como aspectada, pero si marqué la casilla, se estropearán los parámetros.
Estos son los parámetros publicados para la casilla no marcada:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"bGgPGbk+Cuk2q+LEgqetmk4e7xie8dB3iMP9Cj3SUm0=", "order"=>{"customer_name"=>"Duccio Armenise", "duedate"=>"2012-04-25 09:24:00.000000", "preparations_attributes"=>[{"quantity"=>"1", "description"=>"custom recipe", "kind"=>"custom", "cooked"=>"", "recipe_id"=>"9", "id"=>"86", "quantities_attributes"=>[{"ingredient_id"=>"", "qty"=>"", "_destroy"=>"0"}, {"ingredient_id"=>"11", "qty"=>"5.0", "id"=>"193", "_destroy"=>"0"}], "_destroy"=>"0"}], "add_preparation"=>{"recipe_id"=>""}}, "continue"=>"Confirm", "id"=>"31"}
Ahora mira qué desastre cuando marque la casilla de verificación, comenzando desde "cocinado" => "", por alguna razón, Rails está cerrando el hash de preparation_attributes demasiado pronto.
Parameters: {"utf8"=>"✓", "authenticity_token"=>"bGgPGbk+Cuk2q+LEgqetmk4e7xie8dB3iMP9Cj3SUm0=", "order"=>{"customer_name"=>"Duccio Armenise", "duedate"=>"2012-04-25 09:24:00.000000", "preparations_attributes"=>[{"quantity"=>"1", "description"=>"custom recipe", "kind"=>"custom", "cooked"=>""}, {"cooked"=>"1", "recipe_id"=>"9", "id"=>"86", "quantities_attributes"=>[{"ingredient_id"=>"", "qty"=>"", "_destroy"=>"0"}, {"ingredient_id"=>"11", "qty"=>"5.0", "id"=>"193", "_destroy"=>"0"}], "_destroy"=>"0"}], "add_preparation"=>{"recipe_id"=>""}}, "continue"=>"Confirm", "id"=>"31"}
EDIT # 2 :
Creo que me encontré con un error de Rails relacionado con los formularios de recursos anidados profundos y el paso de parámetros: https://github.com/rails/rails/issues/5937
Por ahora lo hice funcionar con un select_tag:
<%= select_tag ''order[preparations_attributes][][cooked]'', options_for_select({yes: 1, no: 0}, preparation.cooked? ? 1 : 0) %>
Creo que cambiar a un select_tag para evitar el "hidden_field gotcha" es una solución aceptable.
De todos modos, gracias por las respuestas!
Puede usar un campo oculto encima de la casilla de verificación:
<%= hidden_field_tag ''object[boolean_attribute]'', nil %>
De esta manera, incluso si su casilla de verificación no está marcada, aún así recibirá ninguna nil
. ¿Eso funcionaría para ti?
Si alguien tiene column boolean y usa check_box_tag, mira esto. Funcionó para mí <%= hidden_field_tag ''order[preparations_attributes][][cooked]'', ''false'' %> <%= check_box_tag ''order[preparations_attributes][][cooked]'', true, preparation.cooked? %>
en mi aplicación Rails, necesitaba agregar comillas simples alrededor de lo verdadero y lo falso.
Código original
<%= f.check_box :admin, {}, true, false %>
Código actualizado
<%= f.check_box :admin, {}, ''true'', ''false'' %>
¡Espero que eso ayude a alguien más!
check_box
(sin _tag
) helper agrega un campo oculto para resolver su problema por usted:
<%= check_box ''object'', ''boolean_attribute'', {}, ''true'', ''false'' %>
# result:
<input name="object[boolean_attribute]" type="hidden" value="false" />
<input id="object_boolean_attribute" name="object[boolean_attribute]" type="checkbox" value="true" />
UPD: tratamiento de recursos anidados (Producto accepts_nested_attributes_for
: line_items)
= form_for @product, url: '''' do |f|
%p
= f.label :title
= f.text_field :title
= f.fields_for :line_items do |li|
= li.check_box :approved
= li.label :approved, li.object.id
%br
= f.submit
Verificando 2 de 3 casillas de verificación me da los params
así:
{..., "producto" => {"título" => "libro de RoR", "line_items_attributes" => {"0" => {"aprobado" => "0", "id" => "47" }, "1" => {"aprobado" => "1", "id" => "48"}, "2" => {"aprobado" => "1", "id" => "51" }}}, "commit" => "Actualizar producto", "acción" => "acción1", "controlador" => "prueba"}
params
como YAML para legibilidad:
product: title: RoR book line_items_attributes: ''0'': approved: ''0'' id: ''47'' ''1'': approved: ''1'' id: ''48'' ''2'': approved: ''1'' id: ''51''
¿Ver? No se distinguen claramente los campos ocultos pero los estados marcados / no marcados.
Tener este params
me permite usar una línea de código para actualizar line_items asociados:
@product.update_attributes params[:product]
Espero que ayude.