Rails 5.2 | Select2多个逗号分隔的参数

时间:2019-01-08 19:08:26

标签: ruby-on-rails jquery-select2 select2-rails

我是Rails的新手,我正在圈子中尝试实现具有多个选择的Select2输入。我已经阅读了StackOverflow上的解决方案,但没有一个对我有帮助,这通常意味着我在做异常错误的事情。

当我提交表单时,它会多次发送具有不同值的 federation_list 参数(标题中的 ):

event[federation_list]: WDC

event[federation_list]: WDSF

我需要在一个联合身份验证参数中用逗号分隔的所有值,然后可以在控制器中拆分这些值。

我已经尝试按照Select2文档中的说明添加name: "federation_list[]",但是我的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

如果与我的活动有很多联盟相关,通过: Event_Federations

GitHub rep

我最终选择了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

我使用了 SteveTurczyns 建议,并在我的强项中添加了 federation_list:[]

那行得通!

1 个答案:

答案 0 :(得分: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: [])