2011-01-26 13 views
3

この奇妙なエラーが発生します。Railsメソッドが表示されない

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

そして、それは、それは動作しますので、それを見つけない:私はその後、私のモデルに

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 

の方法を定義している、私のコントローラ上で、私はこのインスタンスを定義します。私はこの方法、または

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

のようなプロパティを呼び出すときに、変数が適切な属性とメソッドを持つが、関係としてインスタンスとして動作しないのはなぜしかし、その後、私はこのエラー

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

を取得しますか?あなたはそれが実際にデータベースを照会しませんwhereを呼び出すと

それは...

答えて

6

ムービーに複数のレーティングがあるため、@ current_user_ratingはそれらのコレクションです(@ current_user_ratingは複数のレーティングがあります)。次のようにメソッドを呼び出すことでエラーを取り除くことができます。

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

+1、私はあなたが正しいと思います。タイプミス( 'each'への呼び出しの前に '。'がありません);を除く) –

2

をコンソールではなく、サーバー上で作業を行い、それが変換され、データベース上で実行できるオブジェクトを作成します。これは、クエリを実行する前にさらに変更する場合に便利です。

実際には、クエリを実際に実行して結果を得るために、firstまたはallをさらに呼び出します。 (これは、結果が印刷できるように、whereをレールコンソールで呼び出すと自動的に行われることに注意してください)

あなたの場合、ユーザーは映画を1度しか評価しないように思われます以下は、適切と思わ:

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

EDIT:実は私はGStoが正しいと考えて、私は上記に書いたことは、あなたの失敗の理由のようにしていません。エラーメッセージは実際にあなたが呼び出そうとしているメソッドがオブジェクトの配列に対して呼び出されるのに有効ではないと不平を言っています。この場合、firstは単に最初の結果を選択し、他の結果は無視します。

1人のユーザーが複数の評価を取得している映画があるかどうかを再確認するとよいでしょう。実際、意図していない場合、これが許可されていないことを確認する検証を追加することをお勧めします。

関連する問題