Como posso fazer um check_box_tag para postar um parâmetro 'false' ou '0' quando desmarcado?
Com a seguinte check_box_tag:
<%= check_box_tag 'object[boolean_attribute]', 1, object.boolean_attribute %>
Eu posso atualizar o boolean_attribute em apenas uma direção: de false para true.
Quando está desmarcada por padrão (porque object.boolean_attribute é false) e eu a marquei e enviei o formulário, um parâmetro: boolean_attribute => 1 foi postado.
Mas, quando tento atualizar de true para false nenhum parâmetro é passado, então o boolean_attribute permanece verdadeiro.
Em outras palavras, quando é marcado por padrão (porque object.boolean_attribute é true) e eu desmarco-o e, em seguida, envio o formulário, a: boolean_attribute => 0 énão postou.
Como posso fazer este check_box_tag para postar um parâmetro: boolean_attribute => 0 quando desmarcado?
A partir da API não consigo descobrir se há alguma opção para passar facilmente para alcançá-lo:http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag
Obrigado.
EDITAR
Por alguma razão eu não consigo entender, no meu código atual (com uma associação muitos-para-muitos aninhada) o hidden_field_tag não está funcionando.
<%= hidden_field_tag 'order[preparations_attributes][][cooked]', nil %>
<%= check_box_tag 'order[preparations_attributes][][cooked]', '1', preparation.cooked? %>
Agora eu tenho o problema oposto: posso desmarcar a caixa de seleção e a preparação é atualizada como aspectada, mas se eu marcar a caixa de seleção, ela estraga os parâmetros.
Aqui estão os parâmetros publicados para a caixa desmarcada:
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"}
Agora, veja que bagunça quando eu marque a caixa de seleção, começando de "cooked" => "", por alguma razão, o Rails está fechando o hash de preparation_attributes muito cedo!
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:
Acho que me deparei com um bug do Rails relacionado a formulários de recursos aninhados e passagem de parâmetros:https://github.com/rails/rails/issues/5937
Por agora eu fiz isso para trabalhar com um select_tag:
<%= select_tag 'order[preparations_attributes][][cooked]', options_for_select({yes: 1, no: 0}, preparation.cooked? ? 1 : 0) %>
Acho que mudar para um select_tag para evitar o "hidden_field gotcha" é uma solução aceitável.
De qualquer forma, obrigado pelas respostas!