web-dev-qa-db-fra.com

Comment puis-je faire un check_box_tag pour poster un paramètre 'false' ou '0' lorsqu'il n'est pas coché?

Avec le check_box_tag suivant:

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

Je peux mettre à jour boolean_attribute dans une seule direction: de false à true.

Quand est décoché par défaut (parce que object.boolean_attribute est faux) et que je le vérifie puis soumets le formulaire, un paramètre: boolean_attribute => 1 est publié.

Mais , lorsque j'essaie de mettre à jour de vrai à faux, aucun paramètre n'est transmis, donc boolean_attribute reste vrai.

En d'autres termes, lorsque est coché par défaut (car object.boolean_attribute est vrai) et que je le décoche puis soumets le formulaire, a: boolean_attribute => 0 is not publié.

Comment puis-je faire ce check_box_tag pour poster un paramètre: boolean_attribute => 0 lorsqu'il est décoché?

Depuis l'API, je ne peux pas déterminer s'il existe une option à passer pour y parvenir facilement: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag

Je vous remercie.

[~ # ~] modifier [~ # ~]

Pour une raison quelconque, je ne peux pas comprendre, dans mon code réel (avec une association plusieurs à plusieurs imbriquée) le hidden_field_tag ​​ne fonctionne pas.

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

Maintenant, j'ai le problème opposé: je peux décocher la case et la préparation est mise à jour comme prévu, mais si je coche la case, cela gâche les paramètres.

Voici les paramètres affichés pour la case non cochée:

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

Maintenant, voyez quel désordre quand je coche la case, en commençant par "cuit" => "", pour une raison quelconque Rails ferme le hachage preparation_attributes trop tôt!

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 :

Je pense que j'ai rencontré un Rails lié aux formes de ressources imbriquées profondes et au passage de paramètres: https://github.com/Rails/rails/issues/5937

Pour l'instant je l'ai fait fonctionner avec un select_tag:

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

Je pense que le passage à un select_tag afin d'éviter le "got_field gotcha" est une solution de contournement acceptable.

Quoi qu'il en soit, merci pour les réponses!

34
Darme

check_box (sans _tag) helper ajoute un champ caché pour résoudre votre problème:

<%= 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" />

PD: Gestion des ressources imbriquées (Produit 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

Cocher 2 des 3 cases à cocher me donne le params comme ceci:

{..., "product" => {"title" => "RoR book", "line_items_attributes" => {"0" => {"approuvé" => "0", "id" => "47" }, "1" => {"approuvé" => "1", "id" => "48"}, "2" => {"approuvé" => "1", "id" => "51" }}}, "commit" => "Mettre à jour le produit", "action" => "action1", "controller" => "test"}

params en YAML pour plus de lisibilité:

product:
  title: RoR book
  line_items_attributes:
    '0':
      approved: '0'
      id: '47'
    '1':
      approved: '1'
      id: '48'
    '2':
      approved: '1'
      id: '51'

Voir? Aucun champ masqué mais les états cochés/décochés sont clairement distingués.

Avoir ce params me permet d'utiliser une ligne de code pour mettre à jour les line_items associés:

@product.update_attributes params[:product]

J'espère que ça aide.

49
jdoe

Vous pouvez utiliser un champ masqué au-dessus de la case à cocher:

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

De cette façon, même si votre case n'est pas cochée, vous recevrez toujours nil. Cela marcherait-il pour toi?

27
Moz Morris

Si quelqu'un a un type de colonne booléen et utilise check_box_tag alors regardez ça. Ça a marché pour moi. <%= hidden_field_tag 'order[preparations_attributes][][cooked]', 'false' %> <%= check_box_tag 'order[preparations_attributes][][cooked]', true, preparation.cooked? %>

6
viks

dans mon Rails j'avais besoin d'ajouter des guillemets simples autour du vrai et du faux.

Code d'origine

<%= f.check_box :admin, {}, true, false %>

Code mis à jour

<%= f.check_box :admin, {}, 'true', 'false' %>

J'espère que cela aide quelqu'un d'autre!

1
steve hawkes

Pour les cases à cocher de type tableau, vous pouvez également utiliser un hachage:

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