Rails 3.1.3 から Rails 3.2.11 にアップグレードのメモ。

脆弱性対応でRailsをアップグレードしたのでメモ。

http://www.atmarkit.co.jp/ait/articles/1301/10/news081.html

これまでメインで使っていたのが Rails 3.1.3 でこれを 3.2.11 にアップグレード。
ざっくりやった内容をメモ。

【アップグレード先サンプル準備】
Rails 3.2.11 のデフォルトプロジェクトの設定ファイルを手に入れて、既存ソースとの差分を確認する手がかりにするのが目的。

1、どこかの環境で gem install rails して Rails 3.2.11 をインストール
2、rails new dummy とかやって、3.2.11 のプロジェクトを作成 → config のサンプルゲット。
3、作成したプロジェクトフォルダに移動して bundle 実行 → Gemfile, Gemfile.lock のサンプルゲット。



【アプリソース修正】
 既存のソースの config および Gemfile、Gemfile.lock を注意深く差分を見つめつつマージ。
 実際のところ、configは3.1.3のままでも動くが、後々の禍根の種を残さないためにも、configもマージする。


■mass assignment対策の対応
 http://d.hatena.ne.jp/rochefort/20120314/p1
 Rails 3.2.11 のデフォルトプロジェクトのconfigではmass assignment対策がONになっているので、既存ソースのモデルクラスが対応していないから修正を加える。
 (該当箇所をgrepして attr_accessible を書きまくった。面倒だった)

■アセットパイプラインの設定
 Rails2からの歴史的経緯と諸事情があって、もともとアセットパイプラインを利用していなかったので、ここでもOFF。
 (なんか設定増えた?のか、ちょっとハマった)
 


【アップグレード実施】
1、強く推奨されていたので、Ruby も更新(Ruby 1.9.3-p374)
2、gem update --system で gem自身もアップデート
3、修正済みのアプリソースで bundle update
 ※bundle update は、ひとまず各gemを最新にしてGemfile.lockを更新する目的。
 ※production環境で反映するときは更新したGemfile.lockを撒いて bundle 。
4、rspecを実行して確認したり、実際にアプリ起動してテストしたりして、Rails 3.2.11へのアップグレードが正常に完了したことを確認する。
 ※ここで日々のテスト実装の努力が報われる、といいね!


【そのほか】
Railsのアップグレードをした際、キャッシュをクリアしないと、"instance of IO needed" とかいうエラーに怒られる場合がある(というか、怒られた)。
rails runner "Rails.cache.clear" とか実行して一度キャッシュを消してあげたら正常化した。
https://github.com/rails/rails/issues/4042

Rails 3.2.x は 3.1.3 と比べて ActionController::RoutingError (No route matches ...) のスタックトレースが盛大に吐かれるようになった?
ログが肥大化しまくって困るので、存在しないファイルへのアクセスをまじめに解消するなど対応が必要。ログレベルを上げて済まして良い場合はそれでも可。

Ruby 1.9.3-p0 で Rails 3.2.11 を使うと、Modelクラスの処理で謎の例外が発生した。
でもRuby 1.9.3-p374にしたら直ったので気にしない。


■検索しまくってなんとか生き延びることができました。
情報をネットに上げてくれている皆様、あとGoogleさん、ありがとうございます。ホントに。