ruby-on-railsrubydevisenameerroruninitialized-constant

NameError uninitialized constant Model::Object


I'm new to ruby on rails. Ihe error I have is

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

I read on other stack overflow questions that usually the error for wrong names or forgetting belongs_to or has_many but I believe I've set the relations correctly. I am using the gem devise to handle the user and sign in/sign up etc

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

The Renters model is working fine and similar code I have to make a new Renter is working so I am not sure what is wrong.


Solution

  • ActiveRecord::Base classes are usually named in singular.

    Ruby on Rails naming conventions expect your class to be named Review and it should be stored in a file named models/review.rb (but still store its entries in a reviews database table).

    If you do not want to follow this convention, then you have to explicitly tell Rails that the class is named differently in the definition of the belongs_to and has_many association.

    Because such conventions make it much easier to work with Ruby on Rails, I highly recommend following and not fighting those naming conventions.