Rails2.0の足回りと中級者への道
第1回 Rails2.0の足回り
Railsを使っている方も,使っていない方もこんにちは。この特集では,「Rails2.0の足回りと中級者への道」と題して,2007年12月7日にリリースされたRails2.0の基礎と,Rails2.0が提示する新しいアプリケーションの形,について学んでいきたいと思います。
Rails2.0とは何か?
Railsの開発者David Heinemeier Hansson(DHH)自身が語るように,Rails2.0は「革命的というより漸進的(“evolutionary rather than revolutionary”)」なリリースです。バージョンの数値の変化とはうらはらに,Rails1.1とRails1.2間に行われたほどの変革はありません。
ですが,痛みすら伴う数多くの洗練と,RESTfulなアプリケーションへの傾倒を含んだリリースになっています。
この特集ではまず,Rails2.0で行われた変化を探り,Rails2.0の香りを感じていきたいと思います。
Rails2.0の進化と変化
とはいうものの,Rails2.0での機能追加は,はじめてRailsに触れる人にとっては非常に細かな変化がほとんどです。「Railsはじめまして」の方はしばらくご辛抱しておつきあいください。
ActiveRecord
Railsの中でももっとも大きく重要なフレームワークと目されているActiveRecordでも数多くの変更がなされました。
クエリーキャッシュ(Query Cache)
Rails2.0では,Railsの全てのactionの中で,自動でクエリーキャッシュが行われるようになりました。未設定の場合標準でクエリーキャッシュが行われます。
クエリーキャッシュとは,次のことをさします。
「SQLのSELECT文発行の結果を保持し,同じSQLが発行された場合はキャッシュの値を返すこと」
ただし,自動でクエリーキャッシュが行われるのは,Modelインスタンスの存続の間,通常は一つのリクエストの間に限られます。そのため複数のリクエストをまたぐようなキャッシュとしては利用できません。
キャッシュがクリアされるのは「INSERT,UPDATE,DELETEを発行したとき」です。結果が変更されてなくてもキャッシュはクリアされます。
実行時のイメージを,script/consoleで手動キャッシュを行うことで例示してみます。
リスト1 script/console
>> ActiveRecord::Base.cache {
User.find(1) # DBから検索,結果がキャッシュに入る
User.find(1) # キャッシュヒット
}
逆に,actionの中で,クエリーキャッシュを行いたく無い場合には以下のような工夫が必要です。
リスト2 app/model/user..rb
class User < ActiveRecord::Base
class << self
def force_find(*args)
uncached { find(*args) }
end
end
end
リスト2では,Userモデルに,force_findメソッドを追加しています。Rails2.0では,uncachedブロックを指定した場合のみ,キャッシュが行われません。
非キャッシュのfindを実行したい場合は以下のようになります。
リスト3 script/console
>>User.force_find(:all)
ActiveRecordその他の進化
その他の変更点としては,次のようなものが挙げられます。
- 数値のバリデーションが便利に
- DBのスキーマ変更(マイグレーション)が簡単に(Sexy migration)
- テスト用データの作成が簡単に(FoxyFixture)
開発の生産性を向上させるこれらの機能については,次回以降紹介していきたいと思います。
ActionPack(ActionController,ActionView,ActionHelper)
つづいて,ActionController,ActionView,ActionHelperの変化を見ていきます。
Custom Action Delimiter
まず,進化ではなく変化ですが,Rails2.0では,RESTfulなルートでのカスタムアクションの区切り文字が変更になりました。「カスタムアクションの区切り文字」と言ってもピンとこない方も多いかと思います。具体例を挙げてみましょう。
リスト4 config/routes.rb
map.resource :posts, :collection=>{:comments=> :get}
上のルート定義が行われていた場合,Rails1.2では,区切り文字として「;」が使われていました。 Rails2.0ではこれが「/」に変更になりました。
リスト5 Rails1.2
GET /posts;comments
リスト6 Rails2.0
GET /posts/comments
この変化の経緯は,『W3C HTML4.01仕様書の附属書Bに「&」の代用として「;」のサポートを求める』,HTTPサーバへの実装者への推奨からです。そのため素直に,そのとおり実装しているHTTPサーバもあるわけです。ですが,Rails1.2のカスタムアクションの区切りはこれを無視して「;」を区切り文字として使用していました。
ですので,この件についてはRails2.0での変化というより「行儀がよくなった」と言うべきかもしれません。既に,Rails1.2でRESTfulなアプリケーションを作成されている場合は注意が必要です。


