2011-01-26 34 views
3

我得到這個奇怪的錯誤。我已經定義了一個方法,我的模型Rails方法不能在查看

class Rating < ActiveRecord::Base 

    [...] 

    belongs_to :user 
    belongs_to :movie 

    [...] 

    def to_text 
    texto = case self.grade 
      when 0..1 then "horrible" 
      when 2..3 then "bad" 
      when 4..5 then "not bad" 
      when 6..7 then "good" 
      when 8..9 then "very good" 
      when 10 then "master piece" 
      end 
    end 
end 

然後,我的控制器上,我定義這個實例:

@[email protected](:user_id => current_user) 

而且它找到它,所以它的工作原理。但是,當我調用該方法,或類似

<%= @current_user_rating.grade %> 
<%= @current_user_rating.to_text %> 

屬性我得到這個錯誤

undefined method `grade' for []:ActiveRecord::Relation 
undefined method `to_text' for []:ActiveRecord::Relation 

爲什麼變量未表現爲與相應的屬性和方法,但作爲一個關係的實例?

它確實在控制檯上工作,而不是在服務器上...

回答

6

由於電影有多個評分,@ current_user_rating是它們的集合,即使有一個。你應該能夠通過調用你的方法來擺脫錯誤:

<% @current_user_rating.each do |rating| %> 
    <%= rating.grade %> 
    <%= rating.to_text %> 
<% end %> 
+0

+1,我認爲你是正確的。除了打字錯誤(在'each`調用之前缺少'。');) – 2011-01-26 01:10:46

2

當你調用where它實際上並沒有查詢數據庫,它創建可轉換並在數據庫上運行的對象。這對於在查詢運行之前進一步修改查詢很有用。

通常情況下,還會添加firstall以實際執行查詢並獲得結果。 (請注意,這可能是自動完成的,如果你在鐵軌控制檯呼叫where,這樣的結果可以打印)

在你的情況下,它看起來像一個用戶預計將率影片不超過一次,所以以下似乎是適當的:

@[email protected](:user_id => current_user).first 

編輯:其實我覺得GSTO是正確的,我上面寫的並不像你失敗的原因。該錯誤消息實際上是抱怨您嘗試調用的方法無法在對象數組上調用。在這種情況下,first只是選擇第一個結果而忽略其他任何結果。

如果您有任何單個用戶擁有多個評分的影片,請仔細檢查一下。事實上,我建議添加一個驗證來確保這是不允許的,如果它不是有意的。