在 rails 4 中分配具有强参数和嵌套模型的参数
Assign parameters with strong parameters and nested models in rails 4
第一次在这里提问。我尝试了很多答案,但没有一个能解决我的问题。(抱歉我的英语不好,我正在努力改进)。
好的,问题如下:我正在做一个电子商店,它有产品。产品必须有类别,但不一定有子类别。这个想法是,只创建一个产品,包括类别和子类别名称作为参数,rails 必须自动创建类别和子类别表的条目。
问题出在我使用表单创建产品时。当我这样做时,在控制台中我看到:"Unpermitted parameters: category, subcategory"
这是三个模型:
class Product < ActiveRecord::Base
has_one :subcategory
has_one :category, through: :subcategory
accepts_nested_attributes_for :category, :subcategory
end
class Category < ActiveRecord::Base
belongs_to :product
has_many :subcategories
accepts_nested_attributes_for :subcategories
end
class Subcategory < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
控制器相关部分:
def create
@titulo = "Catálogo Online"
@product = Product.create(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Producto creado.' }
else
format.html { render :new }
end
end
end
...
def product_params
params.require(:product).permit(:name, :description, :price, :stock, :code, category_attributes: [:id, :category, :product_id ], subcategory_attributes: [:id, :subcategory, :category_id, :product_id ])
end
和表格
<%= form_for(@product) do |f| %>
<% if @product.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>
<ul>
<% @product.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :category %><br>
<%= f.text_field :category %>
</div>
<div class="field">
<%= f.label :subcategory %><br>
<%= f.text_field :subcategory %>
</div>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :code %><br>
<%= f.text_field :code %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.label :price %><br>
<%= f.number_field :price %>
</div>
<div class="field">
<%= f.label :stock %><br>
<%= f.check_box :stock %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
拜托,这个问题我已经三天了。我不知道该怎么办。谢谢
我想说的是,问题是您正在使用 text_field 类别输入和 sub_category。为了使其工作,您应该使用 select 字段,然后在 UI 中提供另一种方法来创建类别和 sub_categories.
将 f.text_field :subcategory 替换为(并删除 :category 选项,因为您的数据模型不允许这样做)类似于...
<%= f.collection_select :subcategory_id, Subcategory.all, :id, :name, { selected: @product.subcategory_id } %>
…应该使您能够将产品分配给子类别。
此外,您的数据模型在这里看起来不正确。产品需要属于子类别,而不是相反。
第一次在这里提问。我尝试了很多答案,但没有一个能解决我的问题。(抱歉我的英语不好,我正在努力改进)。
好的,问题如下:我正在做一个电子商店,它有产品。产品必须有类别,但不一定有子类别。这个想法是,只创建一个产品,包括类别和子类别名称作为参数,rails 必须自动创建类别和子类别表的条目。
问题出在我使用表单创建产品时。当我这样做时,在控制台中我看到:"Unpermitted parameters: category, subcategory"
这是三个模型:
class Product < ActiveRecord::Base
has_one :subcategory
has_one :category, through: :subcategory
accepts_nested_attributes_for :category, :subcategory
end
class Category < ActiveRecord::Base
belongs_to :product
has_many :subcategories
accepts_nested_attributes_for :subcategories
end
class Subcategory < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
控制器相关部分:
def create
@titulo = "Catálogo Online"
@product = Product.create(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Producto creado.' }
else
format.html { render :new }
end
end
end
...
def product_params
params.require(:product).permit(:name, :description, :price, :stock, :code, category_attributes: [:id, :category, :product_id ], subcategory_attributes: [:id, :subcategory, :category_id, :product_id ])
end
和表格
<%= form_for(@product) do |f| %>
<% if @product.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>
<ul>
<% @product.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :category %><br>
<%= f.text_field :category %>
</div>
<div class="field">
<%= f.label :subcategory %><br>
<%= f.text_field :subcategory %>
</div>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :code %><br>
<%= f.text_field :code %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.label :price %><br>
<%= f.number_field :price %>
</div>
<div class="field">
<%= f.label :stock %><br>
<%= f.check_box :stock %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
拜托,这个问题我已经三天了。我不知道该怎么办。谢谢
我想说的是,问题是您正在使用 text_field 类别输入和 sub_category。为了使其工作,您应该使用 select 字段,然后在 UI 中提供另一种方法来创建类别和 sub_categories.
将 f.text_field :subcategory 替换为(并删除 :category 选项,因为您的数据模型不允许这样做)类似于...
<%= f.collection_select :subcategory_id, Subcategory.all, :id, :name, { selected: @product.subcategory_id } %>
…应该使您能够将产品分配给子类别。
此外,您的数据模型在这里看起来不正确。产品需要属于子类别,而不是相反。