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 гласит, что пары ключ / значение должны отправляться в том же порядке, в котором они появляются в форме, а извлечение параметров получает последнее вхождение любого повторяющегося ключа в строке запроса, что работает для обычных форм.