Как разрешить пользователю выбирать ноль опций в окне множественного выбора в рельсах? - PullRequest
4 голосов
/ 29 июля 2010

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

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

Ответы [ 4 ]

4 голосов
/ 29 июля 2010

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

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

4 голосов
/ 29 июля 2010

Это не имеет ничего общего с рельсами: HTML-форма не будет отправлять такой параметр на сервер, если ничего не выбрано в элементе select.Но вы должны быть в состоянии исправить это в контроллере.Примерно так

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

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

2 голосов
/ 25 января 2012

Мне не нравится предполагать, что значение пусто, если атрибут не опубликован. Это нарушает то, как 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="" />')
});

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

1 голос
/ 29 июля 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>
...