【问题标题】:NameError uninitialized constant Model::ObjectNameError 未初始化常量 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 的类似代码正在运行,所以我不确定出了什么问题。

【问题讨论】:

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


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2014-05-10
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 2015-10-29
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多