教授控制器中未定义的方法

时间:2016-09-21 20:40:24

标签: ruby-on-rails

我有一个系统可以让用户或访客撰写评论。如果用户撰写评论,则与其user_id相关联。如果客人撰写评论,则会要求他们提供用户名,该用户名存储在评论数据库中名为“guest”的列中。

我不完全确定如何做到这一点,但我对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

@review工作正常,@ avg_review也是如此。 Reviews表有一个user_id列,Users表有一个id列。

2 个答案:

答案 0 :(得分:2)

您正在获得ActiveRecord::RelationReview s的集合),而非单个Review的实例。您需要执行Review.where(professor_id: @professor.id).order("created_at DESC").firstReview.find_by_user_id(@professor.id)才能返回单个实例。

也就是说,听起来这种关系并没有正确建模,或者通过其他方式表达你想要做的事情的更好方式。你可以把评论的内容作为一个参数吗?

答案 1 :(得分:0)

您的@review变量实际上包含ActiveRecord::Relation个对象,就像在错误消息中明确指出的那样:

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

那是因为where总是返回一个Relation,即使它只找到一个 记录。