2016-09-21 25 views
0

我有一個讓用戶或訪客撰寫評論的系統。如果用戶撰寫評論,則會與其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 

@re視圖工作正常,所以@avg_review。評論表有一個user_id列,Users表有一個ID列。

+0

'@review.user_id =!nil' - 您不是指'@review.user_id!= nil'? –

回答

2

您得到ActiveRecord::RelationReview的一個集合),而不是一個Review的單個實例。您將需要執行Review.where(professor_id: @professor.id).order("created_at DESC").firstReview.find_by_user_id(@professor.id)來返回單個實例。

這就是說,這聽起來像這種關係沒有適當建模,或者有更好的方式來表達你想通過其他方式來做什麼。你可以路線考慮作爲參數的評論的編號?

+0

尼克我不確定你的意思是「路線以審查的身份參與作爲一個參數」,儘管通過一切手段我都接受了更高效的模式。 – tfantina

+0

我建議像'/ professors /:id /:review_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總是返回一個關係,哪怕只找到一個 記錄。

相關問題