2011-01-26 3 views
3

Я получаю эту странную ошибку. Я определил метод для моей моделиРельсы Метод недоступен в представлении

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, я думаю, вы правы. За исключением опечатки (отсутствует «.» Перед вызовом «каждый»);) –

2

При вызове where это не на самом деле запрос к базе данных, он создает объект, который может быть преобразован и работать с базой данных. Это полезно для дальнейшего изменения запроса перед его запуском.

Обычно для завершения запроса и получения результата добавляется дополнительный вызов first или all. (Обратите внимание, что это может быть сделано автоматически, если вы вызываете where в консоли рельсов, чтобы результат можно было распечатать)

В вашем случае, похоже, что пользователь должен оценивать фильм не более одного раза, поэтому следующее представляется целесообразным:

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

EDIT: на самом деле я думаю, что GSto правильно, что я написал выше, не выглядит как причина вашей неудачи. Сообщение об ошибке на самом деле жалуется, что методы, которые вы пытаетесь вызвать, недействительны для вызова в массиве объектов. В этом случае first просто выбирает первый результат и игнорирует любые другие.

Было бы хорошо дважды проверить, есть ли у вас фильмы, для которых один пользователь имеет несколько рейтингов. На самом деле, я бы рекомендовал добавить проверку, чтобы убедиться, что это недопустимо, если оно не предназначено.

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