Рельсы 5.2 | Select2 Несколько параметров, разделенных запятыми

Я новичок в 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.

представитель GitHub

В итоге я выбрал 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: [] в свои сильные параметры.

И это работает!


person Oliver Curting    schedule 08.01.2019    source источник
comment
Это правильное репо? Нет моделей Federation или EventFederation.   -  person SteveTurczyn    schedule 08.01.2019
comment
О да, извините, @SteveTurczyn. Я забыл отправить его в Git. Я только что добавил его в свою собственную ветку Федерации. Спасибо, что указали!   -  person Oliver Curting    schedule 08.01.2019
comment
И до сих пор нет моделей Federation или EventFederation, и приведенный выше код не появляется.   -  person SteveTurczyn    schedule 09.01.2019
comment
@SteveTurczyn - я понятия не имею, почему файлы не были добавлены в мою фиксацию раньше. Я перепроверил, и теперь они есть на github.com/Curting/mydanceplan/tree/. федерация. Извините за неудобства!   -  person Oliver Curting    schedule 09.01.2019


Ответы (1)


не уверен, что это ваша единственная проблема, но определенная проблема заключается в том, что сильные параметры требуют, чтобы вы явно указывали, является ли параметр модели массивом.

Вместо

  params.require(:event).permit(:title, :country, 
    :city, :start_date, :end_date, :published_at, :user_id,
    :federation_list)

Вы должны иметь

  params.require(:event).permit(:title, :country, 
    :city, :start_date, :end_date, :published_at, :user_id,
    federation_list: [])
person SteveTurczyn    schedule 09.01.2019
comment
Спасибо! Вы направили меня в правильном направлении. Ниже я опишу свое решение. - person Oliver Curting; 10.01.2019