2011-08-19 55 views
1
<%= msg.average_rating %> 

用来返回或者NaN或多项:NaN的,如果msg也没有收到评级或全部的平均评论收到的消息。但现在它返回nil can't be coerced into Fixnum。我一定做了一些事情来破坏代码,但我不知道是什么。什么是nil can't be coerced into Fixnum,我该如何解决?的Rails 3:命令用于返回一个数字现在返回“无不能强迫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 
+0

什么是msg(什么是Ruby类),以及“average_rating”的实现是什么样的? – Casper

+0

'def average_rating @value = 0 self.ratings.each do | rating | @value = @value + rating.value 结束 @total = self.ratings.size @ value.to_f/@ total.to_f end' – user852974

+0

我是相当新的导轨时,你是什么意思“是什么红宝石课是它“? – user852974

回答

2

我猜rating.valuenil一些rating。您的average_rating中没有其他内容会产生该错误。

你可以试试这个:

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

调用nil.to_i为您提供了一个零,而调用x.to_i任何Fixnum对象x给你只是x。你也应该弄清楚为什么rating.value给你一个nil时,它可能不应该。

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

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

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

0

的零问题是因为在你的控制造成你建立一个评价:

@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方法将零置零,或者对数组使用sum方法,该方法将为您处理零。

希望有助于......就像一年后。 :-)