我正在尝试使用foreign_key:category_id保存一个属于Categories_to类别的产品。失败的product.save显示如下:
Processing by ProductsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"2V3zVrgU3SoGAwyHDLYQuyDFWq9rI7U4GdDeZNDRwrLTwsGloio4MIXUOdU/ckvnTsMGF9B9TL4tuNWKSqZpVg==", "product"=>{"name"=>"trek"}, "commit"=>"Save Product", "category_id"=>"1"}
每次我尝试保存产品时都说“类别必须存在”。我知道我的模型和迁移有些不足,但不知道如何做。以下是文件。
product.rb:
class Product < ApplicationRecord
belongs_to :category
end
category.rb:空
create_categories.rb:
class CreateCategories < ActiveRecord::Migration[5.2]
def change
create_table :categories do |t|
t.string :name
t.timestamps
end
end
end
create_products.rb:
class CreateProducts < ActiveRecord::Migration[5.2]
def change
create_table :products do |t|
t.string :name
t.belongs_to :category, index: {unique: true}, foreign_key: true, null: $
t.timestamps
end
end
end
我也可以发布我的product_controller.rb,但这只是@ product.save和redirect_to products_path或'products#index'的标准。
谢谢。
编辑:products_controller.rb:
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to category_products_path([@category, @product])$
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_enti$
end
end
end
def product_params
params.require(:product).permit( :name, :category_id)
end
答案 0 :(得分:0)
您似乎想做类似的事情:
class ProductsController < ApplicationController
def create
@category = Category.find(params[:category_id])
@product = @category.products.new(product_params)
if @product.save
format.html { redirect_to category_products_path([@category, @product]) }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
private
def product_params
params.require(:product).permit(:name, :category_id)
end
end
自然地,这假设您具有以下条件:
class Category < ApplicationRecord
has_many :products
end
class Product < ApplicationRecord
belongs_to :category
end
如您目前所写,至少存在两个问题。
首先,您说:
def product_params
params.require(:product).permit( :name, :category_id)
end
但是,params[:product]
没有category_id
。
第二,你说:
format.html { redirect_to category_products_path([@category, @product])}
但是,您没有定义@category
。
答案 1 :(得分:0)
您应该从类别ID中找到类别,然后在该类别下创建产品。
TestClass
在您的 product / _form.html.erb 中,使用嵌套资源创建class ProductsController < ApplicationController
def create
@category = Category.find(params[:category_id])
@product = @category.products.new(product_params)
if @product.save
format.html { redirect_to category_products_path([@category, @product]) }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity}
end
end
private
def product_params
# as your category_id is outside of product hash, doesn't need to permit in product hash though
params.require(:product).permit(:name)
end
end
,然后在form_for
哈希下获得category_id。