Неинициализированная константа NameError Model::Object

Я новичок в рубине на рельсах. У меня ошибка

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

Я читал в других вопросах о переполнении стека, что обычно возникает ошибка из-за неправильных имен или забвения принадлежности_к или has_many, но я считаю, что правильно установил отношения. Я использую драгоценный камень для обработки пользователя и входа / регистрации и т. д.

Отзывы.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

Модель Renters работает нормально, и аналогичный код, который я должен сделать, работает, поэтому я не уверен, что не так.


person user1558835    schedule 18.12.2016    source источник


Ответы (3)


ActiveRecord::Base классы обычно называются в единственном числе.

Это означает, что ваш класс должен называться Review, и он должен храниться в файле с именем models/review.rb (но при этом сохранять свои записи в таблице базы данных reviews).

Если вы не хотите следовать этому соглашению, вы должны явно указать Rails, что класс назван по-разному в определении ассоциации belongs_to и has_many.

person spickermann    schedule 18.12.2016
comment
спасибо, не знал, что классы должны быть в единственном числе. изменил мои модели и контроллеры, а также пути, и теперь все работает, спасибо - person user1558835; 19.12.2016

ваш класс модели для вашей 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, user_id которой равно 1)

person sa77    schedule 18.12.2016

Это происходит по соглашению Rails. Вы можете принудительно использовать функцию class_name для класса Reviews

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

  has_many :reviews, class_name: "Reviews"
end
person Darlan D.    schedule 02.09.2020