rails4集合通过关联和嵌套模型表单选择has_many

Sea*_*yar 3 forms activerecord ruby-on-rails nested-attributes collection-select

我有一个rails4应用程序.目前,我的收藏选择仅在我选择一个选项时才有效.以下是我的工作代码.我只有产品表格.行业模型填充seeds.rb.IndustryProduct仅用于连接其他2个型号.

我想知道我必须在代码中更改哪些内容才能选择更多内容.

我看到一些工作示例的multiple: true选项如(https://www.youtube.com/watch?v=ZNrNGTe2Zqk 10:20)但在这种情况下,用户界面有点难看+无法用任何样本将其拉下来码.是否还有其他解决方案,例如选择一个选项而不是一个包含多个选项的方框?

楷模:

class Product < ActiveRecord::Base
  belongs_to :user
  has_many :industry_products
  has_many :industries, through: :industry_products
  has_many :product_features

  accepts_nested_attributes_for :industry_products, allow_destroy: true
  accepts_nested_attributes_for :product_features

  validates_associated :industry_products
  validates_associated :product_features
end

class Industry < ActiveRecord::Base
  has_many :industry_products
  has_many :products, through: :industry_products

  accepts_nested_attributes_for :industry_products
end

class IndustryProduct < ActiveRecord::Base
  belongs_to :product
  belongs_to :industry
end
Run Code Online (Sandbox Code Playgroud)

_form.html.erb

<%= form_for @product do |f| %>
  <%= render 'layouts/error_messages', object: f.object %>
  ......
  <%= f.fields_for :industry_products do |p| %>
    <%= p.collection_select :industry_id, Industry.all, :id, :name %>
  <% end %>
  <%= f.fields_for :product_features do |p| %>
    <%= p.text_field :feature, placeholder: "add a feature", class: "form-control" %>
  <% end %>
  <%= f.submit class: "btn btn-primary" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

产品控制器

def new
  @product = Product.new
  @product.industry_products.build
  @product.product_features.build
end

def create
  @product = current_user.products.new(product_params)
  if @product.save
    redirect_to @product
  else
    render action: :new
  end
end
......
def product_params
  params.require(:product).permit(....., industry_products_attributes: [:id, :industry_id, :_destroy], industries_attributes: [:id, :name], product_features_attributes: [:feature])
end
Run Code Online (Sandbox Code Playgroud)

Ric*_*eck 5

首先,你可以治好你的第一个集合选择使用它来设置industry_ids@product:

<%= form_for @product do |f| %>
  <%= f.collection_select :industry_ids, Industry.all, :id, :name %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这将允许您设置collection_singular_ids存在于所有has_many关联的方法.

你必须用params方法备份它:

#app/controllers/products_controller.rb
....
def product_params
  params.require(:product).permit(.... industry_ids: [])
end
Run Code Online (Sandbox Code Playgroud)

比使用嵌套属性更简洁.


要获得"多个"选择,您需要使用以下内容:

<%= f.collection_select :industry_ids, Industry.all, :id, :name, {}, { multiple: true } %>
Run Code Online (Sandbox Code Playgroud)

经过测试和工作 在此输入图像描述

-

您可能还想看看collection_check_boxes:

<%= f.collection_check_boxes :industry_ids, Industry.all, :id, :name %>
Run Code Online (Sandbox Code Playgroud)