Rails 4.0.5 - Обработка параметров с массивами, содержащими пустые строки

С тех пор, как я перешел на 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, а не с проблемой отправки формы.


person Samo    schedule 05.08.2014    source источник


Ответы (1)


Когда вы говорите «без выбора каких-либо состояний», вы имеете в виду, что вы выбрали пустую опцию в выборе? Если это так, то могут быть случаи, когда это допустимый вариант, и если вы сделали какое-то повсеместное решение «превратить все пустые строки в nil», это вполне может закончиться тем, что укусит вас за задницу где-нибудь в другом месте.

Если вы не хотите когда-либо сохранять пустую строку в поле «состояния» (вместо этого сохраняя nil), вы можете переопределить метод установки.

#in Cut model
def states=(string)
  if string.blank?
    self[:states] = nil
  else 
    self[:states] = string
  end
end
person Max Williams    schedule 05.08.2014
comment
Нет пустого тега <option> для выбора, и я ничего не выбрал. Кроме того, мое поле представляет собой массив строк, а не строку. И я в курсе, что я могу убрать это в модели. Я ищу какую-то опцию в помощнике формы, которая не позволяет ему отправлять пробелы, если ничего не выбрано. Ранее бланки не подавались. - person Samo; 05.08.2014
comment
Какой выбор установлен при загрузке страницы? - person Max Williams; 05.08.2014
comment
Он ни на что не установлен. Проверка элемента <select> с помощью JavaScript показывает нулевое значение. - person Samo; 05.08.2014
comment
Можете ли вы опубликовать отображаемый HTML-код выбора? - person Max Williams; 05.08.2014
comment
После повторного просмотра html я думаю, что он решил сделать это с одним из скрытых входных данных, которые он создает, что заставило меня поверить, что он делал это все время и что изменение поведения связано с ActiveRecord, а не с проблемой отправки формы :( - person Samo; 07.08.2014