NameError未初始化的常量Model :: Object

时间:2016-12-18 07:41:12

标签: ruby-on-rails ruby devise nameerror uninitialized-constant

我是铁轨上的红宝石新手。我有错误是

NameError in ReviewsController#create
uninitialized constant User::Review
Extracted source:
    @review = current_user.reviews.build(review_params)

我读过其他堆栈溢出问题,通常是错误名称的错误或忘记belongs_to或has_many,但我相信我已经正确设置了关系。我正在使用gem设计来处理用户并登录/注册等

Reviews.rb

class Reviews < ActiveRecord::Base

  belongs_to :user
    belongs_to :renters

end

User.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :reviews
end

Reviews_Controller.rb

class ReviewsController < ApplicationController
  before_action :set_renter
  before_action :authenticate_user!

  def new
    @review = Reviews.new(renters: @renter)
  end

  def create
    @review = current_user.reviews.build(review_params)
    @review.renter = @renter
    @review.save 
    redirect_to @renter 
  end

  private
    def set_renter
      @renter = Renters.find(params[:renter_id])
    end

    def review_params
      params.require(:reviews).permit(:comment, :rating)
    end
end

Renters模型工作正常,类似的代码我必须使新的Renter工作,所以我不确定是什么问题。

3 个答案:

答案 0 :(得分:1)

ActiveRecord::Base类通常以单数命名。

这意味着您的类应该被命名为Review,并且它应该存储在名为models/review.rb的文件中(但仍将其条目存储在reviews数据库表中)。

如果您不想遵循此约定,则必须明确告诉Rails,在belongs_tohas_many关联的定义中,该类的名称不同。

答案 1 :(得分:0)

您的reviews表的模型类应该在文件中Review app / models / review.rb

class Review < ActiveRecord::Base
  belongs_to :user
  belongs_to :renters
end

并且代表User表的users模型应位于文件中: app / models / user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :reviews
end

注意:要使此关联起作用,您的评论表必须有一列user_id作为在关联模型上执行activerecord操作的外键(例如:User.find(1).reviews以获取{{{}的所有记录1}} reviews为1)

的表格

答案 2 :(得分:0)

根据Rails的约定发生。您可以使用功能conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\file.accdb') cursor = conn.cursor() cursor.execute('select * from Table1') 强制类class_name

Reviews