我得到了这个奇怪的错误。我为我的模型定义了一个方法
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
为什么变量不是具有适当属性和方法的实例,而是作为关系?
它可以在控制台上运行,但不能在服务器上运行......
答案 0 :(得分:6)
由于电影有多个评级,@ current_user_rating是它们的集合,即使有一个。你应该能够通过调用这样的方法来消除错误:
<% @current_user_rating.each do |rating| %>
<%= rating.grade %>
<%= rating.to_text %>
<% end %>
答案 1 :(得分:2)
当您调用where
时,它实际上并不查询数据库,它会创建一个可以在数据库上转换和运行的对象。这对于在运行之前进一步修改查询非常有用。
通常会添加对first
或all
的进一步调用以实际执行查询并获取结果。 (请注意,如果您在rails控制台中调用where
,则可能会自动执行此操作,以便打印结果)
在您的情况下,看起来用户需要对电影评级不超过一次,因此以下内容似乎合适:
@current_user_rating=@movie.ratings.where(:user_id => current_user).first
编辑:其实我认为GSto是正确的,我上面写的内容看起来不像你失败的原因。错误消息实际上是抱怨您尝试调用的方法无法在对象数组上调用。在这种情况下,first
只是选择第一个结果而忽略任何其他结果。
如果您有任何单个用户有多个评级的电影,那么请仔细检查。事实上,我建议添加一个验证,以确保不允许这样做,如果不是这样的话。