Rails创建动态属性

问题描述 投票:1回答:2

我正在尝试用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
ruby-on-rails ruby ruby-on-rails-5 rails-activerecord
2个回答
1
投票

创建一个新模型,一个名为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绝对是您正在寻找的。


-2
投票

这是我发现的一个快速例子

class Product
      belongs_to :collection
    end

    class Collection
      has_many :products
    end

然后在你看来是这样的

<%= collection_select(:product, :collection_id, Collection.all, :id, :name) %>
© www.soinside.com 2019 - 2024. All rights reserved.