Rails 2.0.2で開発中のアプリケーションをEdge Railsにあげてみた

Rails 2.1で導入されるタイムゾーンサポートを開発中のアプリケーションでどうしても使いたくなったので、Edge Railsにあげてみました。意外とひっかかるところが多かったので、以下ググって潰した作業メモです。

まず、Edge RailsをGithubのリポジトリからvender以下にチェックアウト。

% cd <RAILS_ROOT>/vendor
% git clone git://github.com/rails/rails.git

テストを実行して壊れたところを確認。

% rake spec
...EE..E.E........F.........FF.....
...

何かいっぱい出たので順番に潰していきます。

まず、コントローラーのテストで、"You called render with invalid options:…"のようなエラーが出ていたので調べたところ、RSpecのエラーで最新のtrunkでは修正されていました。

Controller examples fail when calling render

最新のRSpecやRSpec-RailsのリポジトリもGithubにあるのですが、僕がチェックアウトした時はバージョンがうまくあわなかったので、今回はRubyforgeのtrunkにスイッチするようにしました。

% ruby script/plugin install -x svn://rubyforge.org/var/svn/rspec/trunk/rspec --force
% ruby script/plugin install -x svn://rubyforge.org/var/svn/rspec/trunk/rspec_on_rails --force
% ruby script/generate rspec

これでRSpecのバージョンをあがったので再度テストしたところ、今度はヘルパーのテストで'metaclass'メソッドが見つからなくなってしまいました。RSpecの1.1.4で取り除かれたようです。

RSpec CHANGES

ここに書かれた通り、ヘルパーのテストを以下のように書き換えて対応します。もしくは、テストファイルを修正していないようであればscript/generate rspec_controller Fooを再実行して、foo_helper_spec.rbのみを上書きしてもOKです。

it "should include the FooHelper" do
  included_modules = (class << self; self; end).send :included_modules
  included_modules.should include(FooHelper)
end

次に、will_paginateで’stack level too deep’ が出ていたので調べたところ、最新の2.2.1では直っていました。

Release 9200 produces SystemStackError

will_paginateのリポジトリもGithubに移っていて、今後はプラグインよりもgemの方を使うように推奨されていたのでいわれた通りにします。

will_paginate

% rm -rf vendor/plugins/will_paginate
% sudo gem install will_paginate

また、プラグインではなくなったので、アプリケーション側で明示的にwill_paginateを読み込んであげる必要があります。Rails 2.1からgemの依存性をconfig/environment.rbで指定できるようになったので、それを使ってみました。

What’s New in Edge Rails: Gem Dependencies

Rails::Initializer.run do |config|
  ...
  config.gem 'will_paginate', :version => '2.2.1'
end

最後にGettext Railsで’file_exists?’がundefinedになってしまっていたので、以下のページを参考に修正しました。僕の場合は、config/initializers/gettext.rb に以下のように記述しています。

Edge Rails and gettext: undefined method file_exists?

require 'gettext/rails'

module ActionView
  class Base
    delegate :file_exists?, :to => :finder unless respond_to?(:file_exists?)
  end
end

以上で、全てのテストが通るようになりました。コンソールで新しいタイムゾーン機能を試してみます。

% irb -rubygems -r config/environment
>> Time.zone
=> nil
>> Time.zone = 'UTC'
=> "UTC"
>> Time.zone.now
=> Wed, 16 Apr 2008 09:47:19 UTC +00:00
>> Time.zone = 'Asia/Tokyo'
=> "Asia/Tokyo"
>> Time.zone.now
=> Wed, 16 Apr 2008 18:47:39 JST +09:00

大丈夫そうです。新しいタイムゾーンサポートの詳細については以下のエントリーが参考になります。

Rails 2.1 Time Zone Support: An Overview

Edge Railsは2.1が正式にリリースされるまでの間、暫定的に使用するので、取りあえずGitで別管理とすることにして、アプリケーションのSubversionリポジトリからは除外しておくことにします。

% svn propset svn:ignore 'rails' vendor

タイムゾーンサポート以外にもHas FinderなどRails2.1の新機能は魅力的です。正式リリースが待ち遠しいですね。

A taste of what’s coming in Rails 2.1

Bookmark and Share