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_to
和 has_many
关联的定义中的名称不同。
【讨论】:
谢谢,不知道类必须是单数的。更改了我的模型和控制器以及路径,它现在可以工作了,谢谢【参考方案2】: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
以获取 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的主要内容,如果未能解决你的问题,请参考以下文章
NameError - 未初始化的常量 Sass::Engine:
NameError 未初始化常量 Model::Object
未初始化的常量 ActionDispatch::Session::EncryptedCookieStore (NameError)