我的产品和用户表出现此错误。
- 找不到没有ID的用户
def set_user
@user = User.find(params[:user_id])
end
我已经嵌套了这样的路线..
resources :users do
resources :products do
resources :reviews
end
end
这是我的产品控制器..
class ProductsController < ApplicationController
before_action :require_signin, except: [:index, :show]
before_action :set_user
def index
@products = @user.products
end
def show
@product = Product.find(params[:id])
end
def edit
@product = Product.find(params[:id])
end
def update
@product = Product.find(params[:id])
if @product.update(product_params)
redirect_to [@user, @product], notice: "Product successfully updated!"
else
render :edit
end
end
def new
@product = @user.products.new
end
def create
@product = @user.products.new(product_params)
@product.user = current_user
if @product.save
redirect_to user_products_path(@product, @user), notice: "Product successfully created!"
else
render :new
end
end
def destroy
@product = Product.find(params[:id])
@product.destroy
redirect_to user_products_path(@product, @user), alert: "Product successfully deleted!"
end
private
def product_params
params.require(:product).permit(:title, :description, :posted_on, :price, :location, :category)
end
def set_user
@user = User.find(params[:user_id])
end
end
我要做的就是关联用户和产品,以便产品belongs_to用户,用户has_many产品。
class Product < ActiveRecord::Base
belongs_to :user
has_many :reviews
class User < ActiveRecord::Base
has_secure_password
has_many :reviews, dependent: :destroy
has_many :products, dependent: :destroy
答案 0 :(得分:1)
对于控制器的任何操作,您应该传递user_id param。 错误的原因是params [:user_id]等于nil
答案 1 :(得分:1)
正如其他用户提到的那样,params [:user_id]值可能为零。
也就是说,您似乎已经在控制器的范围内定义了current_user。我在创建动作中看到它被引用。我敢打赌它是由require_sign_in before_action设置的。鉴于我认为你想要做的事情,它可能会使你的set_user before_action有点多余。
您可以在当前使用@user的任何地方引用控制器中的current_user。或者,您可以在set_user before_action中设置@user = current_user。
<强>的SideNote 强>:
仔细观察你的创作动作:
def create
@product = @user.products.new(product_params)
@product.user = current_user
if @product.save
redirect_to user_products_path(@product, @user), notice: "Product successfully created!"
else
render :new
end
end
如果我错了,请纠正我,但我相信做@ model.association.new这样的事情会为新创建的关联对象设置model_id,所以我会更改两行
@product = @user.products.new(product_params)
@product.user = current_user
只是
@product = current_user.products.new(product_params)