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.valueそれはnil一部の人のためだと思いratingます。average_ratingそのエラーを生成するものは他にありません。

これを試すことができます:

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

を呼び出すnil.to_iと 0 が返されますがx.to_i、Fixnum を呼び出すとが返されxます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>

value=nil です。

そのため、ビルドを呼び出す前に average_rating を変数に割り当ててビューで使用するか、to_i メソッドを使用して nil をゼロにするか、配列で sum メソッドを使用して nil を処理することができます。

それが役に立てば幸いです... 1年後のように。:-)

于 2012-08-03T10:37:21.780 に答える