Метод Rails недоступен в View - PullRequest
3 голосов
/ 26 января 2011

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

    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=@movie.ratings.where(: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

Почему переменная не ведет себя как экземпляр с соответствующими атрибутами и методами, а как отношение?

Он работает на консоли, но не на сервере ...

Ответы [ 2 ]

6 голосов
/ 26 января 2011

, поскольку фильм имеет несколько рейтингов, @current_user_rating представляет собой их коллекцию, даже если она есть.вы должны быть в состоянии избавиться от ошибок, вызывая ваши методы следующим образом:

<% @current_user_rating.each do |rating| %>
  <%= rating.grade %>
  <%= rating.to_text %>
<% end %>
2 голосов
/ 26 января 2011

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

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

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

@current_user_rating=@movie.ratings.where(:user_id => current_user).first

РЕДАКТИРОВАТЬ : На самом деле я думаю, что GSto правильно, то, что я написал выше, не похоже на причину вашей неудачи. Сообщение об ошибке фактически жалуется на то, что методы, которые вы пытаетесь вызвать, недопустимы для вызова в массиве объектов. В этом случае first просто выбирает первый результат и игнорирует любые другие.

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

...