2011-08-11 56 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' 

我該如何解決這個問題?

在此先感謝

解決方案: 更新我的Heroku堆棧到Ruby 1.9。

回答

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]來解決這個問題,或者切換到一個Ruby 1.9棧在Heroku。

+0

Thx!更新我的heroku堆棧到1.9,一切正常。 –

2

在Ruby 1.8下,String#[]返回引用字符的ASCII碼,而不是字符本身。在您的控制器中嘗試l.name[0,1].capitalize