NameError 未初始化常量 Model::Object

Posted

技术标签:

【中文标题】NameError 未初始化常量 Model::Object【英文标题】:NameError uninitialized constant Model::Object 【发布时间】:2017-05-03 13:10:12 【问题描述】:

我是 ruby​​ on rails 的新手。我的错误是

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

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

评论.rb

class Reviews < ActiveRecord::Base

  belongs_to :user
    belongs_to :renters

end

用户.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 的类似代码正在运行,所以我不确定出了什么问题。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢,不知道类必须是单数的。更改了我的模型和控制器以及路径,它现在可以工作了,谢谢【参考方案2】:

reviews 表的模型类在文件中应为 Reviewapp/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 以获取 reviews 表的所有记录,其 @ 987654330@ 是 1)

【讨论】:

【参考方案3】:

这是按照 Rails 的约定发生的。你可以用函数class_name强制类Reviews

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

  has_many :reviews, class_name: "Reviews"
end

【讨论】:

以上是关于NameError 未初始化常量 Model::Object的主要内容,如果未能解决你的问题,请参考以下文章

未初始化的常量 Twitter (NameError)

NameError - 未初始化的常量 Sass::Engine:

Mongoid:未初始化的常量(NameError)

NameError 未初始化常量 Model::Object

未初始化的常量 ActionDispatch::Session::EncryptedCookieStore (NameError)

未初始化的常量 OpenSSL (NameError)