Rails2.3アプリをRails3.2にアップグレードする、その1

以前Ruby on Rails 2.3 (Ruby1.8.7) で作ったアプリを、Rails3.2 (Ruby 1.9.3)にアップグレードしようと決意しました。

ただし、それほど性能の良いサーバーで稼働しているわけではないので、3.2にした時の性能(リソースの使用量)等も気になりますので早めに動かし性能を測定する事にしました。


やること

  1. git co -b rails3.2
  2. とりあえずRails3.2で動かす
  3. 性能測定
  4. RSpecを通す
  5. Cucumberを通す
  6. リファクタリング
  7. 入替

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() を追加
  • [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...) ありますよね :-)