1
<%= msg.average_rating %>

用于返回 NaN 或数字:如果msg没有收到评级,则返回 NaN 或消息收到的所有评级的平均值。但现在它回来了nil can't be coerced into Fixnum。我一定做了一些事情来破坏代码,但我不知道是什么。什么是nil can't be coerced into Fixnum,我该如何解决?

  def average_rating
      @value = 0
      self.ratings.each do |rating|
          @value = @value + rating.value
      end
      @total = self.ratings.size
      @value.to_f / @total.to_f
  end
4

2 回答 2

2

我猜这rating.valuenil为了某些人rating。您的任何其他内容都average_rating不会产生该错误。

你可以试试这个:

self.ratings.each do |rating|
    @value = @value + rating.value.to_i
end

调用nil.to_i给你一个零,而调用x.to_i任何 Fixnumx给你只是x. 你还应该弄清楚为什么在它可能不应该rating.value给你的时候给你一个。nil

此外,您可以使用inject代替each

@value = self.ratings.inject(0) { |sum, rating| sum += rating.value.to_i }

但这并不能解决您的nil问题,只是想我会提到它。

于 2011-08-20T00:17:17.547 回答
0

导致 nil 问题是因为在您的控制器中您建立了一个评级:

@rating = @someobject.ratings.build 

所以从你的数据库:

@someobject.ratings.count = x 

在调用构建后在您的控制器中时,您有

@someobject.ratings.count = x+1 

带参数

#<Rating id: nil, user_id: nil, category_id: 2, value: nil, created_at: nil, updated_at: nil>

它的价值=零。

因此,您可以在调用构建之前将 average_rating 分配给一个变量并在您的视图中使用它,使用 to_i 方法将 nil 归零,或者使用数组上的 sum 方法,它将为您处理 nil。

希望能有所帮助......就像一年后。:-)

于 2012-08-03T10:37:21.780 回答