HerokuでRMagickを使おうとしてrequireでハマった
HerokuでRMagickを使おうとしてハマった。結論を先に書くと、requireするときは小文字のrmagickじゃダメで、ちゃんとキャピタライズされたRMagickじゃないといけなかったみたい。MacとWindowsでローカルで使ってたときは小文字で普通に使えてたので、原因に気づくまでちょっと時間が掛かった。あと、BundlerでBundler.requireするときも、そのままでは同じところでハマるので注意が必要。
小文字は不正解
requireに大文字が混じるのは、個人的にはなんとなくダサい感じがするので、小文字で動くなら小文字で書きたいところだけど、RMagickは許してくれなかった。
require 'rmagick' #=> 不正解
require 'RMagick' #=> 正解
前者だとHerokuではApplication Errorになる。エラー時のログの該当箇所を抜粋。
[2011-04-07T02:35:04+00:00 app[web.1]: [/usr/ruby1.8.7/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- rmagick (LoadError)
Bundler.require
Bundlerを使ってBundler.requireする時もこれでハマるので、Gemfileの書き方をちょっと変える必要がある。
gem 'rmagick' #=> 不正解
gem 'rmagick', :require => 'RMagick' #=> 正解
Bundler.requireした時に、RMagickではなくrmagickと記述してしまっているときのエラーは、前述のApplication ErrorではなくInternal Server Errorになるっぽい。