Rails创建动态属性

时间:2017-02-14 12:32:44

标签: ruby-on-rails ruby ruby-on-rails-5 rails-activerecord

我正在尝试与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

2 个答案:

答案 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) %>