2016-09-21 4 views
0

У меня есть система, которая позволяет пользователям или гостям написать отзыв. Если пользователи пишут отзыв, это связано с их user_id. Если гости пишут отзыв, им предлагается указать имя пользователя, которое хранится в столбце «гость» в базе данных отзывов.Неопределенный метод в контроллере профессоров

Я не совсем уверен, как это сделать, но то, что я сделал с professor_controller является:

def show 
    @review = Review.where(professor_id: @professor.id).order("created_at DESC") 
    @avg_review = @review.average(:hw) 
    if @review.user_id = !nil 
     @user = User.where(id: @review.user_id) 
    else 
     @user = @review.guest 
    end 
    render 
end 

Однако, это приводит к ошибке:

NoMethodError in ProfessorsController#show 
undefined method `user_id=' for #<Review::ActiveRecord_Relation:0x007fed19228e28> 

Я получаю это ошибка даже до того, как я поставил оператор if. У меня была такая же проблема, когда мой контроллер выглядел так:

def show 
    @review = Review.where(professor_id: @professor.id).order("created_at DESC") 
    @avg_review = @review.average(:hw) 
    @user = User.where(id: @review.user_id) 
end 

@re просмотр отлично работает, поэтому @avg_review. Таблица отзывов имеет столбец user_id, а таблица Users имеет столбец id.

+0

'@review.user_id =! Nil' - Вы не имеете в виду '@review.user_id! = Nil'? –

ответ

2

Вы получаете ActiveRecord::Relation (коллекция Review), а не один экземпляр обзора. Вам нужно будет сделать Review.where(professor_id: @professor.id).order("created_at DESC").first или Review.find_by_user_id(@professor.id), чтобы вернуть один экземпляр.

Это говорит о том, что это отношение не правильно смоделировано, или есть лучший способ выразить то, что вы хотите сделать с помощью других средств. Можете ли вы направить маркер на идентификатор обзора в качестве параметра?

+0

Ник. Я не уверен, что вы подразумеваете под «маркером в идентификаторе обзора как параметра», хотя я, конечно, открыт для более эффективной модели. – tfantina

+0

Я предлагаю маршрут, например '/ professors /: id /: review_id', где обзор является идентификатором одного обзора. Тем не менее, я смущен тем, что вы назвали '@ review', поэтому возможно, что вы действительно хотите иметь отношения между пользователями и отзывами вместо того, чтобы создавать' user_id' в вашем контроллере. –

+0

Думаю, я понимаю, о чем вы говорите. Однако в этом случае вы никогда не увидите индивидуальный обзор, обзоры просто отображаются на странице профессора. Поэтому я не уверен, что если бы у вас был маршрут, как вы рекомендовали, исправьте меня, если я ошибаюсь. Я довольно новичок в рельсах. – tfantina

0

Ваш @review переменная фактически держит ActiveRecord::Relation объект, как это ясно сказано в сообщении об ошибке:

NoMethodError in ProfessorsController#show 
undefined method `user_id=' for #<Review::ActiveRecord_Relation:0x007fed19228e28> 

Это потому, что where всегда возвращает отношение, даже если он находит только один запись.

Смежные вопросы