Ruby on Rails中的多对多关系,无法使用“多个选择字段”创建多个记录

问题描述

我在两个模型(区域和清单)之间有很多关系。我正在尝试在“列表”表单上使用fields_for,以便多选Region并为每个选定Region创建一个Regionalization行。

我只需一次输入就可以创建区域化连接,但无法在下面进行多选操作。

任何线索都很好。谢谢。我想我需要在区域化表单中为每个选定区域的创建方法中创建一个循环。

列表模型

  has_many :regionalizations
  has_many :regions,through: :regionalizations
  accepts_nested_attributes_for :regionalizations

区域模型

  has_many :regionalizations
  has_many :listings,through: :regionalizations

区域化模型

  belongs_to :region
  belongs_to :listing
  accepts_nested_attributes_for :region

列表控制器

  def new
    @listing = Listing.new
    @listing.regionalizations.build
  end
  
  def create
    @listing = Listing.new(listing_params)
    @listing.user_id = current_user.id
    
    if @listing.save
      redirect_to @listing,notice: "Your Listing was created successfuly"
    else
      render :new
    end  
  end


  def listing_params
    params.require(:listing).permit(:name,:excerpt,:description,:email,:website,:phone_number,:user_id,:featured_image,:category_id,:regionalization_id,regionalizations_attributes: [:id,:region_id,:listing_id],regions_attributes: [:id,:name])
  end

列表形式

<%= form.fields_for :regionalizations do |regionalization_form| %>
    <%= regionalization_form.collection_select(:region_id,Region.all,:id,:name,{multiple: true},{class: 'form-control'}) %>
<% end %>

解决方法

因此,在进行了一些挖掘和Ryan Bates的一个非常老的vid以及Steve Polito的一个更新版本的帮助下,我实现了解决方案。上面的设置实际上允许我在表单中添加多个区域。我只需要使用控制器来遍历build方法。

3.times { @listing.regionalization.build } 

这向我显示了我可以添加三个区域,它们将在提交表单时独立创建。一旦工作,

我知道我需要添加破坏每个表单输入并最终创建一些JavaScript的功能。一旦知道了这一点,我就知​​道我也可以使用Javascript添加一个新字段,并且可以删除上面代码中的初始循环,因为用户现在可以添加和销毁区域化字段。

此链接是史蒂夫(Steve)的极大帮助,很高兴看到这种方法,而无需在嵌套字段中使用gem'cocoon'或类似符号。

http://railscasts.com/episodes/196-nested-model-form-part-1

https://stevepolito.design/blog/create-a-nested-form-in-rails-from-scratch/

Steve也为此提供了非常清晰的解决方案,并且还提供了出色的脚本以及与Rails 6一起使用。谢谢大家。

我希望这对可能遇到它的人有所帮助。