Как разрешить пользователю выбирать нулевые параметры из поля множественного выбора в рельсах?

У меня есть модель настроек со столбцом options, и я настроил ее для сериализации с помощью serialize :options. На мой взгляд, у меня есть поле множественного выбора, использующее select("settings", "options", ['option1','option2','option3'], {}, :multiple => true), которое отлично работает, пока пользователь выбирает хотя бы один вариант. Однако, если они не выбирают какие-либо параметры, параметры не отправляются и поэтому параметры не обновляются.

Как разрешить пользователю выбирать нулевые параметры из поля множественного выбора в рельсах?


person Simon    schedule 29.07.2010    source источник


Ответы (4)


Мне не нравится предполагать, что значение пусто, если атрибут не опубликован. Это нарушает ожидаемый Rails способ обновления атрибутов и может создавать проблемы, если вы используете действия контроллера также для API и HTML. Мой предпочтительный способ справиться с этим - добавить скрытое поле ввода перед множественным выбором.

<input type="hidden" value="" name="parent_model[my_attribute_ids][]">

Если вы используете JQuery, вы можете автоматизировать добавление этих скрытых полей ввода:

$('select[multiple="multiple"]').each(function(i){
    $(this).before('<input type="hidden" name="'+this.name+'" value="" />')
});

Я понимаю, что этот ответ не очень своевременен, но я надеюсь, что это поможет кому-то с подобным вопросом.

person Sean McCleary    schedule 25.01.2012

Это не имеет ничего общего с рельсами: html-форма не отправит такой параметр на сервер, если в элементе «выбрать» ничего не выбрано. Но вы должны быть в состоянии исправить это в контроллере. Что-то вроде этого

if params[:settings] == nil
  params[:settings] = [];
end

Не уверен, что есть более элегантное решение.

person Nikita Rybak    schedule 29.07.2010
comment
Решение theIV идеально подходит, особенно для полей с множественным выбором без пустых опций. - person Matthew Clark; 03.11.2011
comment
Эта стратегия может иметь непреднамеренные последствия, если вы также используете одно и то же действие для обработки других запросов. Rails предполагает, что если вы обновляете и не отправляете атрибуты, им не нужно обновлять исключенные атрибуты. Заставлять атрибут быть пустым, если он не отправляется в качестве параметра, может быть потенциально опасным предположением. Я разместил альтернативный подход ниже, используя скрытые поля ввода. - person Sean McCleary; 25.01.2012

Добавьте скрытое поле после поля выбора, которое отправляет пустое значение в «настройки [параметры]».

Это тот же трюк, который используется в rails, чтобы гарантировать, что непроверенные флажки будут опубликованы как ложные.

person Alex Bartlow    schedule 29.07.2010

Вы можете указать вариант «Нет».

Пример из: http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html

select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {:include_blank => 'None'}, {:multiple => true})

Станет

<select name="post[person_id]" multiple="multiple">
  <option value="">None</option>
  <option value="1">David</option>
  <option value="2" selected="selected">Sam</option>
  <option value="3">Tobias</option>
</select>
person maček    schedule 29.07.2010
comment
Это создает странный интерфейс — что это значит, если они выберут «Нет» и «Дэвид»? И он по-прежнему делает неожиданные вещи, если они ничего не выбирают. - person Simon; 13.08.2010
comment
если они ничего не выбирают, то ничего не происходит - вместо того, чтобы очищать ассоциацию, как следует. - person Simon; 20.09.2010