rails4 collection select with has_many 通过关联和嵌套模型形式
rails4 collection select with has_many through association and nested model forms
我有一个 Rails4 应用程序。目前我的 collection select 只有在我 select 只有一个选项时才有效。下面是我的工作代码。我只有产品形式。行业模型填充了 seeds.rb
。 IndustryProduct仅用于连接其他2个模型。
我想知道我必须更改代码才能选择更多。
我看到了一些带有 multiple: true
选项的工作示例,例如 (https://www.youtube.com/watch?v=ZNrNGTe2Zqk at 10:20) 但在这种情况下 UI 有点难看 + 无法拉动它关闭任何示例代码。是否有其他解决方案,比如让更多的盒子选择一个选项,而不是一个盒子选择多个选项?
型号:
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
_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 %>
产品负责人
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
首先,您可以修复第一个集合 select,方法是使用它为 @product
:
设置 industry_ids
<%= form_for @product do |f| %>
<%= f.collection_select :industry_ids, Industry.all, :id, :name %>
<% end %>
这将允许您设置 collection_singular_ids
方法,该方法适用于所有 has_many
关联。
你必须在参数方法中备份它:
#app/controllers/products_controller.rb
....
def product_params
params.require(:product).permit(.... industry_ids: [])
end
比使用嵌套属性更简洁。
要获得 "multiple" selection,您需要使用以下内容:
<%= f.collection_select :industry_ids, Industry.all, :id, :name, {}, { multiple: true } %>
已测试并正常工作
--
您可能还想看看 collection_check_boxes
:
<%= f.collection_check_boxes :industry_ids, Industry.all, :id, :name %>
我有一个 Rails4 应用程序。目前我的 collection select 只有在我 select 只有一个选项时才有效。下面是我的工作代码。我只有产品形式。行业模型填充了 seeds.rb
。 IndustryProduct仅用于连接其他2个模型。
我想知道我必须更改代码才能选择更多。
我看到了一些带有 multiple: true
选项的工作示例,例如 (https://www.youtube.com/watch?v=ZNrNGTe2Zqk at 10:20) 但在这种情况下 UI 有点难看 + 无法拉动它关闭任何示例代码。是否有其他解决方案,比如让更多的盒子选择一个选项,而不是一个盒子选择多个选项?
型号:
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
_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 %>
产品负责人
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
首先,您可以修复第一个集合 select,方法是使用它为 @product
:
industry_ids
<%= form_for @product do |f| %>
<%= f.collection_select :industry_ids, Industry.all, :id, :name %>
<% end %>
这将允许您设置 collection_singular_ids
方法,该方法适用于所有 has_many
关联。
你必须在参数方法中备份它:
#app/controllers/products_controller.rb
....
def product_params
params.require(:product).permit(.... industry_ids: [])
end
比使用嵌套属性更简洁。
要获得 "multiple" selection,您需要使用以下内容:
<%= f.collection_select :industry_ids, Industry.all, :id, :name, {}, { multiple: true } %>
已测试并正常工作
--
您可能还想看看 collection_check_boxes
:
<%= f.collection_check_boxes :industry_ids, Industry.all, :id, :name %>