Ruby on Rails -- multiple selection in f.select

I have the following select box in my form:

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"}
                                 ) %>

I want to allow the user to make multiple selections and also make the size of the select box 5.

How to do that for the code above?


Solution 1:

After your { :prompt => "Please select"} add another hash with html options e.g.

<%= 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 }
                                 ) %>

Once you've done this you might want to move your :prompt option (keep the empty {} though so that html attributes don't get treated as Rails options.)

Also you'll need to ensure your controller code is correctly accepting and handling multiple values.

Solution 2:

In case of collection, try

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

Solution 3:

I have a fully working example (including preselection when editing the object), when:

  • Object is the considered object
  • similar_ids is the key to relations, and is a string

In the form:

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][]'}

And in the Object.rb model:

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

These posts helped me out:

  • Select tag with multiple values pre-selected - Values inserted manually in database
  • Ruby on Rails: Submitting an array in a form

Hope it helps