Ruby on Rails — multiple selection in f.select

前端 未结 5 505
故里飘歌
故里飘歌 2020-12-02 15:21

I have the following select box in my form:

Related Type:   <%= f.select(:TYPE, [[\'Type A\', \'Type A\'],
                                  [\'T         


        
相关标签:
5条回答
  • 2020-12-02 15:47

    { :prompt => "Please select"}, { :multiple => true, :size => 5 } {} is important when f.select

    0 讨论(0)
  • 2020-12-02 15:49

    HTML

    <%= form.select(:product_ids, Product.all.collect {|p| [ p.name, p.id ] }, 
                                                       { :prompt => "Please select"}, 
                                                       { :multiple => true, :size => 5  }) %>
    

    Controller

    @category = Category.new(category_params) 
    
    def category_params
        params.require(:category).permit(:name, product_ids: [])
    end
    
    0 讨论(0)
  • 2020-12-02 15:50

    In case of collection, try

        <%= f.select(:TYPE, Categories.collect {|p| [ p.name, p.id ] }, 
                                               { :prompt => "Please select"}, 
                                               { :multiple => true, :size => 5 }) %>
    
    0 讨论(0)
  • 2020-12-02 16:01

    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.

    0 讨论(0)
  • 2020-12-02 16:06

    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

    0 讨论(0)
提交回复
热议问题