Simple_form: почему генерируются два входных тега вместо одного?

Почему simple_form генерирует входные теги дважды для логических полей (одно скрытое, а другое нет)?

В моем simple_form у меня есть это:

<%= form.input :over_phone, as: :boolean, input_html: {checked: true} %>

который генерирует это:

<div class="control-group boolean optional order_over_phone">
  <label class="boolean optional control-label" for="order_over_phone">Order over phone</label>
  <div class="controls">
    <input name="order[over_phone]" type="hidden" value="0">
    <label class="checkbox">
      <input checked="checked" class="boolean optional" id="order_over_phone" name="order[over_phone]" type="checkbox" value="1">
    </label>
  </div>
</div>

Как видите, один входной тег скрыт со значением 0, а другой скрыт со значением 1. Если я отправляю форму, в параметрах публикации я получаю оба значения:

order[over_phone]:0
order[over_phone]:1

У меня есть случайное поведение при создании модели, связанное с этим логическим полем, так что мне интересно, вызвано ли оно simple_form. Это не происходит с не булевыми типами полей.

Если вы столкнулись с подобной проблемой, пожалуйста, поделитесь своим опытом.

Я использую simple_form 2.1.0.

1 ответ

Решение

check_box получил

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

Спецификация HTML говорит, что непроверенные флажки не успешны, и, следовательно, веб-браузеры не отправляют их. К сожалению, это вводит принцип: если модель Invoice имеет оплаченный флаг и в форме, которая редактирует оплаченный счет, пользователь снимает флажок, оплаченный параметр не отправляется. Итак, любая идиома массового назначения вроде

@invoice.update(params[:invoice])

не будет обновлять флаг.

Чтобы предотвратить это, помощник создает вспомогательное скрытое поле перед самим флажком. Скрытое поле имеет то же имя, и его атрибуты имитируют непроверенный флажок.

Таким образом, клиент либо отправляет только скрытое поле (представляющее флажок снят), либо оба поля. Поскольку спецификация HTML гласит, что пары ключ / значение должны отправляться в том же порядке, в котором они появляются в форме, а извлечение параметров получает последнее вхождение любого повторяющегося ключа в строке запроса, что работает для обычных форм.

Другие вопросы по тегам