Я новичок в Rails, и я бегаю по кругу, пытаясь реализовать ввод Select2 с множественным выбором. Я читал решения на StackOverflow, и ни одно из них мне не помогло, что обычно означает, что я делаю что-то необычайно неправильное.
Когда я отправляю форму, она несколько раз отправляет мой параметр federation_list с разными значениями (в заголовках):
event[federation_list]: WDC
event[federation_list]: WDSF
Мне нужны все значения в одном параметре Федерации, разделенные запятой, которые я затем могу разделить в своем контроллере.
Я пытался добавить name: "federation_list[]"
, как указано в документации Select2, но мой form_with перезаписывает его, поэтому он теряет скобки.
Обновлено! Я нашел решение, и это мой рабочий код:
select2_initializer.js
$( document ).on('turbolinks:load', function() {
$( "#event_federation_list" ).select2({
theme: "bootstrap",
multiple: true,
placeholder: 'Select Federation(s)',
width: 'style'
}).val('').trigger('change');
});
_form.html.erb
<div class="form-group">
<%= form.label :federation_list, value: "Federations", class: "form-label" %>
<%= form.select :federation_list, options_from_collection_for_select(Federation.all, :id, :name, {:selected => @event.federations.map(&:id)}), {}, { multiple: true } %>
</div>
:selected позволяет отображать выбранные параметры, когда пользователь редактирует форму.
event.rb
def federation_list
self.federations.map(&:name).join(', ')
end
def federation_list=(names)
self.federations = names.split(',').map do |n|
Federation.where(name: n.strip).first_or_create!
end
end
Если это релевантная информация, мое событие has_many: Federations, через: Event_Federations.
В итоге я выбрал Selectize вместо Select2, но решение остается верным для Select2.
Затем я написал этот фрагмент кода в своем event.rb:
def federation_list
self.federations.map(&:name).join(', ')
end
def federation_list=(ids)
self.federations = ids.reject!(&:empty?).map do |id|
Federation.where(id: id).first
# Use .first_or_create! to let the user add new objects
end
end
Я воспользовался советом Стива Турчина и добавил federation_list: [] в свои сильные параметры.
И это работает!