2011-02-01 4 views
41

У меня есть следующее поле выбора в моей форме:Рубин на Rails - множественный выбор в f.select

Related Type: &nbsp; <%= f.select(:TYPE, [['Type A', 'Type A'], 
            ['Type B', 'Type B'], 
            ['Type C', 'Type C'], 
            ['Type D', 'Type D'], 
            ['Type E', 'Type E'] 
           ],{ :prompt => "Please select"} 
           ) %> 

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

Как это сделать для кода выше?

ответ

65

После вашего { :prompt => "Please select"} добавьте еще один хэш с параметрами html, например.

<%= f.select(:TYPE, [['Type A', 'Type A'], 
            ['Type B', 'Type B'], 
            ['Type C', 'Type C'], 
            ['Type D', 'Type D'], 
            ['Type E', 'Type E'] 
           ],{ :prompt => "Please select"}, 
            { :multiple => true, :size => 5 } 
           ) %> 

После того, как вы сделали это, вы можете переместить :prompt вариант (оставить пустой {}, хотя так, что атрибуты HTML не обработаны как Rails варианты.)

Также вам нужно чтобы ваш код контроллера правильно принимал и обрабатывал несколько значений.

+6

Почему это добавить «---» и «-» для каждого невыбранного варианта, который хранится в: TYPE? –

+0

Когда я сохраняю его в форме, он принимает дополнительную пустую "" в позиции 0 "ids" => [[0] "", [1] "some_id"] –

8

В случае сбора, попробуйте

<%= f.select(:TYPE, Categories.collect {|p| [ p.name, p.id ] }, 
              { :prompt => "Please select"}, 
              { :multiple => true, :size => 5 }) %> 
+1

Не должно быть 'Category.all. collect'? –

0

{: проворный => "Пожалуйста, выберите"}, {: множественный => верно,: размер => 5} {} важен, когда f.select

6

у меня есть полностью рабочий пример (в том числе предварительного выбора при редактировании объекта), когда:

  • Object является рассматриваемый объект
  • similar_ids является ключом к отношениям, и является string

В форме:

form_for(@object) do |f| 
    = f.select :similar_ids, options_from_collection_for_select(Object.all, :id, :name, {:selected => @object.similar_ids.split(';')}), {}, {:multiple => true, :size => 4, :name => 'object[similar_ids][]'} 

И в Object.rb модели:

class Object < ActiveRecord::Base 
    before_save :handle_similars 

    def handle_similars 
    self.similar_ids = self.similar_ids.select(&:present?).join(';') 
    # .select(&:present?) is necessary to avoid empty objects to be stored 
    end 

    def similars 
    self.class.find(self.similar_ids.split(';')) 
    end 

end 

Эти посты помогли мне:

Надеется, что это помогает

+0

Важно, чтобы имя заканчивалось на '[]', так что рельсы интерпретируют параметры как массив значений – Josh

Смежные вопросы