2011-02-01 23 views
41

tengo el siguiente cuadro de selección en mi forma:Ruby on Rails - selección múltiple en 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"} 
           ) %> 

Quiero permitir al usuario hacer selecciones múltiples y también hacer el tamaño del cuadro de selección 5.

¿Cómo hacer eso para el código de arriba?

Respuesta

65

Después de su { :prompt => "Please select"} agregue otro hash con opciones html, p. Ej.

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

Una vez que haya hecho esto puede que desee mover su opción :prompt (mantener el vacío {}, aunque por lo que los atributos HTML no reciben tratamiento como carriles de opciones.)

también que necesitará para garantizar que su código de controlador acepte y maneje correctamente valores múltiples.

+6

¿Por qué con este complemento "---" y "-" para cada opción no seleccionada que se almacena en: TIPO? –

+0

Cuando lo guardo en forma toma un "" vacío adicional en la posición 0 "ids" => [[0] "", [1] "some_id"] –

8

En caso de recogida, tratar

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

No debería ser 'Category.all. recoger'? –

0

{: prompt => "Por favor seleccione"}, {múltiple => true,: tamaño => 5} {} es importante cuando f.select

6

tengo un ejemplo completamente de trabajo (incluyendo preselección al editar el objeto), cuando:

  • Object es el objeto considerado
  • similar_ids es la clave de las relaciones, y es una string

En la forma:

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

Y en el modelo 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 

Estos mensajes me ayudó:

creo que sirve

+0

Es importante que el nombre termine en '[]' para que los rieles interpreten los params como una matriz de valores – Josh