Rails2.3アプリをRails3.2にアップグレードする、その1
以前Ruby on Rails 2.3 (Ruby1.8.7) で作ったアプリを、Rails3.2 (Ruby 1.9.3)にアップグレードしようと決意しました。
ただし、それほど性能の良いサーバーで稼働しているわけではないので、3.2にした時の性能(リソースの使用量)等も気になりますので早めに動かし性能を測定する事にしました。
1. とりあえずRails3.2で動かす
Rails3.2環境に移行
現行のRails2.3のコードを使うのですが、app/assetsやconfig以下などは Rails3.2に合わせないと行きません。そこで Rails3.2.3のRailsコマンドの空のプロジェクトを作成し、そこから(元のconfigはリネームし) config やapp/assets などを持ってきて Rails3.2の環境に合わせる
準備
- 必要なライブラリー、プラグインを Gemfileに登録。 fastercsv や will_paginate など止めたい物もありますが、まずは動かす為にぐっとこられました ^^;
- Ruby1.9用にマジックコメントの追加、magic_encoding で一発
エラー、問題点をひたすらつぶす
問題になった点を上げておきます
- RAILS_ENV → Rails.env 、 RAILS_ROOT → Rails.root
- lib/ が読み込まれないので config/application.rb に config.autoload_paths += %W(#{Rails.root}/lib) を追加
- named_scope → scope
- filter_parameter_logging を消す
- <% form_tag → <%= form_tag
- app/assetsの作成
- public/{images,javascripts,stylesheets} を app/assets へ移動
- application.js , application.css の作成
- def before_save のようなCallbackメソッドが廃止されたので before_save :before_save_.... に置き換え
- 文字コードの正規表現の一部変更 (Ruby 1.9)
- htmlタグを戻すhelperメソッドに raw() を追加
- XSSセキュリティーホールを作らないように、必要な部分には html_escape()
- [1,2,3].to_s → [1,2,3].join (Ruby 1.9)
- Module#public_instance_methods の戻りが文字列の配列からシンボルの配列に変わった (Ruby 1.9)
- f.error_messagesメソッドが無くなったことへの対応。以下のようなhelperを作り対応
def form_error_messages!(f) if f.object.errors.any? errs = f.object.errors.full_messages.inject("") do |result, msg| result + " <li>" + msg + "</li>\n" end raw(%! <div id="error_explanation"> <h2>#{t('activerecord.errors.title')}</h2> <ul> #{errs} </ul> </div> !) else "" end end
感想
いろいろと問題がありましたが、思っていたよりは変更作業は少なかった気がします。皆さんも Rails2.3 アプリの Rails3.2対応にトライして下さい ! もちろんテスト(RSpec...) ありますよね :-)