我正在尝试用RoR制作电子商务商店。我做的大多数必要的功能没有任何问题,但现在我真的需要一些人的帮助。
我想制作产品属性,如“大小”,“重量”,“颜色”等。最简单的方法是在模型迁移中定义此属性,但现在我想使属性动态化。主要问题是,在尝试创建产品时,我无法从表单中获取所有带有属性的参数。
产品/ new.html.erb
<%= form_for @product, url: admin_products_path(@product) do |f| %>
<%= f.label :name, 'Name' %>
<%= f.text_field :name, class: "form-control" %>
<%= text_field_tag "product[product_feature][]" %>
<%= text_field_tag "product[product_feature][]" %>
<%= f.submit "Submit" %>
<% end %>
因此,我想生成许多具有属性名称和值的字段,填充它们并在控制器中使用这些参数来进行交互,最后创建产品属性。
喜欢
params[:product_features].each do |k, v|
ProductFeature.create(name: k, value: v, product_id: product_id)
end
所有可以使用动态属性操作的gem都无法使用Rails 5+,因此我需要找到解决此问题的方法。
我甚至为此工作了简单的数据库解决方案,但是创建params是不舒服的。这里是。
Product.rb
class Product < ApplicationRecord
has_many :product_features
has_many :features, :through => :product_features
end
ProductFeature.rb
class ProductFeature < ApplicationRecord
belongs_to :product
belongs_to :feature
end
Feature.rb
class Feature < ApplicationRecord
end
创建一个新模型,一个名为ProductAttribute的产品的子项,具有两个属性。
Class ProductAttribute < ApplicationRecord
belongs_to :product
validates :name, presence: true
validates :value, presence: true
end
然后使用cocoon,或只使用accepts_nested_attributes
class Product < ApplicationRecord
has_many :product_attributes, as: :attributes
accepts_nested_attributes_for :attributes, allow_destroy: true
end
class ProductsController < ApplicationController
.
.
.
private
.
.
def product_params
params.require(:product).permit(. . . attributes_attributes: [:id, :name, :value])
end
end
Cocoon绝对是您正在寻找的。
这是我发现的一个快速例子
class Product
belongs_to :collection
end
class Collection
has_many :products
end
然后在你看来是这样的
<%= collection_select(:product, :collection_id, Collection.all, :id, :name) %>