Rails3.1 + Ruby2.0だとSprocketsが上手く動作しない不具合に対するモンキーパッチ

超レアなケースですがRails3.2.13以前のRailsアプリをRuby2.0以上で動かさなければいけないときに、rake assets:precompileしてもJSのコードがプリコンパイルされないSprocketsの不具合があります。

具体的な現象

Rails3.2.13以前 + Ruby2.0系において、

//= require jquery
//= require jquery_ujs

と、application.jsを定義しても、rake assets:precompile後のファイルが

//= require jquery
//= require jquery_ujs
;

となってしまい、jQueryが上手く読み込まれないといった現象が発生します。

そういうわけで

諸事情で今すぐのバージョンアップが難しいときのモンキーパッチがこちらになります。

こちらのコードを[RAILS_ROOT]/config/initializers以下に配置すれば問題は解消します。

なんで?

  • Ruby2.0から正規表現エンジンがOnigmoに変わったので、パースするための正規表現に影響が出た。
  • Ruby2.0からprivateメソッドに対するrespond_to?の書き方が変わったので、Ruby1.9系までの書き方だと必ずfalseが返ってしまい、上手くSprocketsのディレクティブが読み込まれない結果になった。

でも普通の人は

ちゃんとRailsの最新版にバージョンアップすれば良いと思います。