Ruby on Rails - множественный выбор в f.select
У меня есть следующий флажок в моей форме:
Related Type: <%= 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.
Как это сделать для кода выше?
Ответы
Ответ 1
После того, как ваш { :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.)
Также вам необходимо убедиться, что ваш код контроллера правильно принимает и обрабатывает несколько значений.
Ответ 2
В случае сбора, попробуйте
<%= f.select(:TYPE, Categories.collect {|p| [ p.name, p.id ] },
{ :prompt => "Please select"},
{ :multiple => true, :size => 5 }) %>
Ответ 3
У меня есть полностью рабочий пример (включая предварительный выбор при редактировании объекта), когда:
-
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
Эти сообщения помогли мне:
Надеюсь, что это поможет
Ответ 4
{: prompt = > "Пожалуйста, выберите" }, {: multiple = > true,: size = > 5} {} важно, когда f.select
Ответ 5
HTML
<%= form.select(:product_ids, Product.all.collect {|p| [ p.name, p.id ] },
{ :prompt => "Please select"},
{ :multiple => true, :size => 5 }) %>
контроллер
@category = Category.new(category_params)
def category_params
params.require(:category).permit(:name, product_ids: [])
end