外键不保存滑轨5

时间:2018-07-26 07:00:07

标签: ruby-on-rails ruby

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

2 个答案:

答案 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。