找不到没有id的用户?

时间:2014-11-13 21:30:37

标签: ruby-on-rails activerecord

我的产品和用户表出现此错误。

- 找不到没有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

2 个答案:

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