rails multiple check_box_tag ruby-on-rails ruby-on-rails-3 checkbox params

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.