С тех пор, как я перешел на Rails 4.0.5, началось нежелательное поведение с формой для модели, которая использует массив строк postgresql.
def up
add_column :cuts, :states, :text, :array => true
end
В форме используется collection_select
<%=
f.collection_select(
:states,
states,
:last,
:first,
{},
:multiple => true,
:class => 'chosen chosen_allow_deselect'
)
%>
Я также пытался принудительно ввести :include_blank => false
, но независимо от того, если я отправлю форму без выбора каких-либо состояний, params[:cut][:states]
оценивается как [""]
, что в конечном итоге записывается в базу данных. Теперь мое поле states
не пустое, хотя должно быть.
Очевидно, я мог бы написать обратный вызов before_validation
или attribute_normalizer
для очистки массива, но я надеюсь, что есть какой-то способ просто отключить эту «функцию» и предотвратить интерпретацию ввода формы Rails таким образом.
Обратите внимание, что множественный выбор для отношений HABTM также отправляет массив с пустой строкой, но Rails знает, как с этим справиться, и не пытается назначить запись для пустого значения. Кажется, что это создает реальную проблему только тогда, когда поле является фактическим массивом.
Обновить
Чтобы быть конкретным, я надеюсь, что есть опция помощника формы, о которой я не знаю, которая хорошо предотвращает отправку пробелов, когда ничего не выбрано и нет пустого тега <option>
. Наши серверы в настоящее время используют 4.0.2, и эта проблема вообще не возникает на серверах. Код приложения, который я выполняю локально, идентичен тому, что выполняется на серверах. Отсюда я делаю вывод, что новая версия Rails делает что-то другое.
Обновить
После повторного просмотра html я думаю, что он решил сделать это с одним из скрытых входных данных, которые он создает; он добавляет такой ввод:
<input name="cut[states][]" type="hidden" value="">
Это наводит меня на мысль, что он делал это все время и что изменение поведения связано с ActiveRecord, а не с проблемой отправки формы.