2011-08-11 11 views
3

次のコードを使用して、最初の文字に応じて場所をグループ化します。Heroku Ruby NoMethodError string.capitalize

mobile_controller:

def index 
    @locations = Location.all.group_by{|l| l.name[0].capitalize.match(/[A-Z]/) ? l.name[0].capitalize : "#"} 
end 

ビュー:

<% @locations.keys.sort.each do |starting_letter| %> 
    <%= starting_letter %> 
    <% @locations[starting_letter].each do |location| %> 
    <%= location.name %>   
    <% end %> 
<% end %> 

すべては私のローカルマシン上で正常に動作しますが、Herokuのは、それを好きではないと私は、このエラーを示す保持:

NoMethodError (undefined method `capitalize' for 66:Fixnum): 
app/controllers/mobile_controller.rb:13:in `search' 
app/controllers/mobile_controller.rb:13:in `search' 

どうすればこの問題を解決できますか?事前に

おかげ

ソリューション: のRuby 1.9に私のHerokuのスタックを更新しました。

答えて

5

あなたのローカルマシンはおそらくRuby 1.9で、あなたのHerokuアプリケーションは1.8で動作しています。

Ruby 1.8では、String#[]を呼び出すと文字コード(数字)が表示されますが、Ruby 1.9では最初の文字が表示されます。

# Ruby 1.8 
"test"[0] 
# => 116 

# Ruby 1.9 
"test"[0] 
# => "t" 

あなたはこれを回避するためにl.name[0..0]を使用するか、またはHerokuの上のRuby 1.9のスタックに切り替えることができます。

+0

Thx!私のherokuスタックを1.9にアップデートしたところ、すべて正常に動作しました。 –

2

Ruby 1.8では、String#[]は、文字そのものではなく、参照文字のASCIIコードを返します。お使いのコントローラでl.name[0,1].capitalizeを試してください。

関連する問題