5

我是 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

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

4

3 回答 3

5

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

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

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

于 2016-12-18T07:47:34.503 回答
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表的所有记录user_id

于 2016-12-18T14:53:03.183 回答
0

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

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

  has_many :reviews, class_name: "Reviews"
end
于 2020-09-02T11:10:05.850 回答