我正在尝试与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 %>
所以,我想生成许多具有属性名称和值的字段,填充它们并在控制器中使用这些参数来进行交互,最后创建产品属性。</ p>
像
params[:product_features].each do |k, v|
ProductFeature.create(name: k, value: v, product_id: product_id)
end
所有可以使用动态属性操作的宝石都不能使用Rails 5+,所以我需要找到解决这个问题的方法。
我甚至为此工作了简单的数据库解决方案,但创建参数令人不舒服。在这里。
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
答案 0 :(得分:0)
创建一个新模型,该模型是名为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
茧绝对是您想要的。
答案 1 :(得分:-2)
这是我发现的一个快速例子
class Product
belongs_to :collection
end
class Collection
has_many :products
end
然后在你看来像这样的
<%= collection_select(:product, :collection_id, Collection.all, :id, :name) %>