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で取り除かれたようです。
ここに書かれた通り、ヘルパーのテストを以下のように書き換えて対応します。もしくは、テストファイルを修正していないようであれば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の方を使うように推奨されていたのでいわれた通りにします。
% 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の新機能は魅力的です。正式リリースが待ち遠しいですね。