2012-07-18 9 views
6

私は奇妙なエラーが発生しています。私のアプリは、私のローカルホスト上で完全に正常動作しますが、私のHerokuのサーバー上では、このエラーを与えている:ここでTypeError (String can't be coerced into Fixnum):TypeError(文字列をFixnumに強制することはできません)?

は私のコードです:

@rep = rep_score(@u) 

エラーをスローラインのログによります。私はそれをコメントして、Herokuへの変更をプッシュし、アプリは正常に実行されます。ここ

rep_score方法であって

def rep_score(user) 
rep = 0 
user.badges.each do |b| 
    rep = rep + b.rep_bonus 
end 
return rep 
end 

rep_bonusデータベース内の整数です。

これもローカルホスト上で完全に正常に動作します。どう考えているか教えてください。


rep_score方法からreturnを除去した後、それが正常に働いています。私はまだRubyを初めて使っていますが、returnを置くと何か問題がありますか?それは他の言語からの習慣です。

答えて

10

Rubyは、文字列と数学的な状況の組み合わせツールとして+を使用しています。

簡単な修正:

def rep_score(user) 
rep = 0 
user.badges.each do |b| 
    rep = rep + b.rep_bonus.to_i 
end 
return rep 
end 

to_i整数に文字列の結果から、データベースモデルからおそらくrep_bonusを、変更されています。あなたが設定できるいくつかの異なる型キャストがあります。いくつかの変換に名前を付けるには:

  • アレイ:to_a
  • フロート:to_f
  • 整数:to_i
  • 文字列:私は、彼らは両方とも整数であるとき、何かを型キャストしないといけないのはなぜto_s
+2

?そして、なぜlocalhost上で動作するのかは分かりません。 – Deekor

+1

普遍的な質問はなぜですか?私は正確になぜ答えはありませんが、それは問題を解決します。私は自分のデータベースから引き出された整数が、常に正しいタイプとして設定されているわけではないことを発見しました。問題が私のDB(私はMySQLを使用している)であろうとなかろうと、単純な型変換が問題全体を修正するので気にしません。 ローカルホストとプロダクションは全く異なる環境です。数百万の可能性があります。 Rubyのバージョンは異なりますが、宝石のポートは同じではなく、プラットフォームの違い、データベースのバージョンが異なります...リストが頻繁に変わり、40個の文字が残っています。 – CrazyVipa

+0

私の編集を読んだら、この質問に答える前に 'return'を取り除くことで修正したのを見ることができます。リターンがエラーの原因になった理由はありますか? – Deekor

関連する問題