2012-04-23 13 views
29

Con el siguiente check_box_tag:¿Cómo puedo hacer que check_box_tag publique un parámetro 'falso' o '0' cuando no está marcado?

<%= check_box_tag 'object[boolean_attribute]', 1, object.boolean_attribute %> 

puedo actualizar el boolean_attribute en una sola dirección: de falso a verdadero.

Cuando está desmarcado de forma predeterminada (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 está marcada por defecto (porque object.boolean_attribute es cierto) y la desactiva y luego enviar el formulario, a: boolean_attribute => 0 es no publicado.

¿Cómo puedo hacer que check_box_tag publique un parámetro: boolean_attribute => 0 cuando está desmarcado?

de la API no puedo averiguar si hay alguna opción para pasar a lograr fácilmente: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag

Gracias.

EDITAR

Por alguna razón no puedo comprender, en mi código real (con una asociación muchos-a-muchos anidado) la hidden_field_tag ​​no está funcionando.

<%= hidden_field_tag 'order[preparations_attributes][][cooked]', nil %> 
<%= check_box_tag 'order[preparations_attributes][][cooked]', '1', preparation.cooked? %> 

ahora tengo el problema opuesto: Puedo desactive la casilla de verificación y la preparación se actualiza como aspectado, pero si marca la casilla de verificación se mete hasta los parametros.

Éstos son los parametros sobre la casilla sin marcar:

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 ver lo que es un lío cuando compruebo la casilla de verificación, a partir de "cocido" =>"", por alguna razón los rieles está cerrando los preparation_attributes hash demasiado temprano!

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"} 

editar # 2:

Creo que me encontré con un error rieles en relación con las formas de recursos anidados de profundidad y que pasa param: https://github.com/rails/rails/issues/5937

Por el momento llegué a trabajar con un select_tag :

<%= select_tag 'order[preparations_attributes][][cooked]', options_for_select({yes: 1, no: 0}, preparation.cooked? ? 1 : 0) %> 

creo que el cambio a una select_tag con el fin de evitar la "Gotcha hidden_field" es un una solución aceptable.

De todos modos, gracias por las respuestas!

Respuesta

43

check_box (w/o _tag) ayudante añade campo oculto para hacer frente a su problema para 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: ocupan de los 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 

Comprobando 2 de 3 casillas de verificación me da el params como esto:

{..., "producto" => {"título" => "Libro de RoR", "line_items_attributes" => {"0" => {"approved" => "0", "id" => "47 "}," 1 "=> {" aprobado "=>" 1 "," id "=>" 48 "}," 2 "=> {" aprobado "=>" 1 "," id "=>" 51 "}}} "comprometerse"=>" actualización de producto", "acción"=> "acción1", "controlador"=> "test"}

params como YAML para facilitar la lectura:

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 esta params me permite usar una línea de código para actualizar line_items asociados:

@product.update_attributes params[:product] 

espero que ayude.

+0

Gracias, pero estaba buscando una solución check_box_tag porque en mi código actual estoy actualizando un recurso anidado. Ver mi código real en la edición. ¿Es la solución aplicable a un formulario de recursos anidados también? – Darme

+0

Sí, ¡es adecuado! Nada le impide pasar algo como ''orden [preparados_atribuciones] [] [cocido] '' en lugar de''objeto''. – jdoe

+0

Por el momento, hice una solución alternativa al cambiar a una solución select_tag (ver EDIT # 2), pero voy a probar tu sugerencia también ... – Darme

25

Se puede usar un campo oculto por encima de la casilla:

<%= hidden_field_tag 'object[boolean_attribute]', nil %> 

De esta manera, incluso si su casilla de verificación no está marcada, usted todavía consigue nil enviado. ¿Eso funcionaría para ti?

+1

Hay un enfoque más conveniente. Ver mi respuesta – jdoe

+0

Bien, me gusta. –

+0

Gracias, conocía este enfoque, busco algo más porque, por algún motivo, en mi aplicación real esto no funciona (tengo algunos modelos muchos-a-muchos anidados ...). Estoy actualizando la pregunta con mi código real ... – Darme

0

Para matriz como casillas de verificación, se puede usar un hash también:

= hidden_field_tag "ad_ids[#{ad.token}]" , false 
= check_box_tag "ad_ids[#{ad.token}]" , true, true 
4

Si alguien tiene columna de tipo booleano y el uso de check_box_tag entonces mira esto. Funcionó para mí <%= hidden_field_tag 'order[preparations_attributes][][cooked]', 'false' %> <%= check_box_tag 'order[preparations_attributes][][cooked]', true, preparation.cooked? %>

1

en mi aplicación de rieles Necesito 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 ayude a alguien más!

Cuestiones relacionadas