Rails视图中不可用的方法

4
我遇到了一个奇怪的错误。我为我的模型定义了一个方法。
    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

由于一部电影可能有多个评分,因此@current_user_rating是它们的集合,即使只有一个。您可以通过以下方式调用方法来消除错误:

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

+1,我认为你是正确的。除了错别字(在调用each之前缺少'.');) - Mike Tunnicliffe

2
当您调用where时,实际上并没有查询数据库,而是创建了一个可以转换并运行在数据库中的对象。这对于在运行查询之前进一步修改查询非常有用。
通常会添加进一步调用firstall来实际执行查询并获取结果。(请注意,如果您在rails控制台中调用where,则可能会自动完成此操作,以便打印结果)
在您的情况下,似乎期望用户只为电影评分一次,因此以下内容似乎比较合适:
@current_user_rating=@movie.ratings.where(:user_id => current_user).first
编辑:实际上,我认为GSto是正确的,我之前写的内容似乎不是你失败的原因。错误信息实际上在抱怨你试图调用的方法无法在对象数组上调用。在这种情况下,first 只是选择第一个结果并忽略其他任何结果。

最好再仔细检查一下是否有某些电影被单个用户评分了多次。事实上,如果没有这样的意图,我建议添加验证以确保不允许这种情况发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接