Подтвердить что ты не робот

Как я могу сделать check_box_tag для публикации параметра "false" или "0" при снятии флажка?

Со следующим check_box_tag:

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

Я могу обновить boolean_attribute только в одном направлении: от false до true.

Если флажок отмечен по умолчанию (потому что object.boolean_attribute является ложным), и я проверяю его, а затем отправляю форму, отправляется a: boolean_attribute = > 1.

Но, когда я пытаюсь обновить от true до false, параметр не передается, поэтому значение boolean_attribute остается верным.

Другими словами, когда проверяется по умолчанию (потому что object.boolean_attribute истинно), и я сниму его, а затем отправлю форму, a: boolean_attribute = > 0 отправлено not.

Как я могу сделать этот check_box_tag для публикации параметра a: boolean_attribute = > 0 при снятии флажка?

Из api я не могу понять, есть ли какой-то вариант, чтобы легко его достичь: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag

Спасибо.

ИЗМЕНИТЬ

По какой-то причине я не могу понять, в моем фактическом коде (с вложенной связью "многие-ко-многим" ) hidden_field_tag ​​не работает.

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

Теперь у меня есть противоположная проблема: я могу снять флажок, и подготовка обновляется как аспектированная, но если я поставлю флажок, это испортит параметры.

Здесь размещены параметры для отмеченного флажка:

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

Теперь посмотрим, какой беспорядок, когда я устанавливаю флажок, начиная с "cooked" = > "", по какой-то причине Rails закрывает хеш prep_attributes слишком рано!

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

РЕДАКТИРОВАТЬ № 2:

Я думаю, что я столкнулся с ошибкой Rails, связанной с глубокими вложенными формами ресурсов и передачей param: https://github.com/rails/rails/issues/5937

Теперь я сделал это для работы с select_tag:

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

Я думаю, что переход на select_tag во избежание "hidden_field gotcha" является приемлемым обходным решением.

В любом случае, спасибо за ответы!

4b9b3361

Ответ 1

check_box (w/o _tag) помощник добавляет скрытое поле для решения вашей проблемы:

<%= 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: Работа с вложенными ресурсами (Продукт 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

Проверка 2 из 3 флажков дает мне params как это:

{..., "product" = > { "title" = > "RoR book", "line_items_attributes" = > { "0" = > { "approved" = > "0", "id" = > "47" }, "1" = > { "approved" = > "1" , "id" = > "48" }, "2" = > { "approved" = > "1" , "id" = > "51" }}}, "commit" = > "Обновить продукт", "действие" = > "action1", "controller" = > "test" }

params как YAML для удобочитаемости:

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

См? Никакие скрытые поля, кроме отмеченных/непроверенных состояний, четко различаются.

Имея этот params, я могу использовать одну строку кода для обновления связанных строк:

@product.update_attributes params[:product]

Надеюсь, это поможет.

Ответ 2

Вы можете использовать скрытое поле над флажком:

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

Таким образом, даже если ваш флажок не установлен, вы все равно получите nil. Будет ли это работать для вас?

Ответ 3

Если у кого-то есть тип столбца boolean и используется check_box_tag посмотрите на это. Это сработало для меня. <%= hidden_field_tag 'order[preparations_attributes][][cooked]', 'false' %> <%= check_box_tag 'order[preparations_attributes][][cooked]', true, preparation.cooked? %>

Ответ 4

в моем приложении rails мне нужно было добавить одиночные кавычки вокруг true и false.

Исходный код

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

Обновленный код

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

Я надеюсь, что это поможет кому-то еще!

Ответ 5

Для таких массивов, как флажки, вы также можете использовать хэш:

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