Rails2.0の足回りと中級者への道

第1回 Rails2.0の足回り

この記事を読むのに必要な時間:およそ 5 分

RESTful Routing

Rails1.2以降,RESTfulなアプリケーションのためRoutingにさまざまな機能が追加されています。Rails2.0ではさらにいくつかの機能が採用になりました。

  1. :name_prefixが不要に(自動でprefixがつきます)
  2. namespace機能(ルーティングにネームスペースが追加可能に)
  3. has_manyとhas_one Routing

ここでは,一番有用そうな,has_manyとhas_oneについて紹介したいと思います。

リスト7 Rails2.0

map.resources :articles,
    :has_many => [:comments, :tags],
    :has_one => :user

これは,Rails2.0以前の以下の記述と同じです。

リスト8

map.resources :articles do |article|
   article.resources :comments
   article.resources :tags
   article.resource :user
end

ActiveRecordで,関連を作成する,:has_many,:has_oneの対応と意味的に同型であるため,Rails2.0以降は,Routingで:resources,:resourceを使い分けるのではなく,:has_many,:has_oneを利用する方が明解であると思います。

Rails1.2以降採用になった,RESTfulなRoutingは短いスペースで紹介するには非常に複雑な機能であるため,次回以降再度取り上げたいと思います。

部分レイアウト(Partial Layout)

これは,render:partialの中身にたいしてさらに:layoutを適用することができる,という機能です。

リスト9 app/views/links/show.html.erb

<% for link in @links do %>
  <%= render :partial => 'link',
             :layout => 'link_summary',
             :locals => {:link => link} %>
<% end %>

上のコードが,メインとなるテンプレートです。ここで部分テンプレート(partial template)として,_link.html.erbを読み込んでいます。ここまではいままでどおりの部分テンプレートですが,見慣れない:layout指定があります。

この:layoutオプションで指定したレイアウトを適用し,部分テンプレートを表示します。

リスト10 app/views/links/_link.html.erb

<a href="<%=link.url%>"><%= link.title %></a>
<div id="comment"><%=link.comment%></div>

以下が,部分レイアウト(Partial Layout)です。ここで注意すべき点として,この部分レイアウトファイルは,app/views/layoutディレクトリではなく,コントローラ用のディレクトリに入れる必要があります。

リスト11 app/views/links/_link_summary.html.erb

<div id="link_<%= link.id %>">
  <%= yield %>
</div>

ActionPackその他の進化

そのほか,クライアントとサーバ間のレスポンスを向上させる以下の変更が組み込まれました。

  1. 画像用,CSS用といった複数のリソース用サーバがあるようにブラウザに思い込ませる(AssetServers)
  2. 複数のCSSや,Javascriptファイルを一つにまとめることで並列にダウンロードさせる(AssetCaching)
  3. セッションの保持がRuby PStoreからクッキーに変更(Cookie-based Session)

Ajaxを縦横に用いた即時のレスポンスが必要なアプリケーションでは重宝する拡張であると思います。

rake

Rails自身の変化につづいて,Railsの補助ツールであるRailtiesの変化についてです。

Rails2.0では,開発時のさまざまな局面で助けとなる,rakeタスクが追加されました。

routes(Route Listing Task)

Rails1.2以降,RESTful対応でRailsのRoute情報は複雑化の一途をたどっています。

このタスクではその複雑さを少しでも軽減するため,config/routes.rbで設定した情報を可視化します。

リスト12

% rake routes|grep DELETE
DELETE /hellos/:id                      {:controller=>"hellos", :action=>"destroy"}
DELETE /hellos/:id.:format              {:controller=>"hellos", :action=>"destroy"}

db:rollback

MigrationのバージョンをSTEP=Nで指定したNの分だけ過去に戻します。

リスト13

rake db:rollback STEP=1

Rails2.0以前は,このような相対的なバージョン指定ができなかったため, 現在のDBのバージョンを調べてから1減らした値を指定する,という面倒な作業を行う必要がありました。

Rails2.0以降では,db:rollbackを用いることでそういった局面での手数を減らすことができます。アジャイルなDB設計にとってはありがたい機能です。

notes:todo,notes:fixme

これはRails2.0で,ソースコードアノテーション(Source Code Annotations)といわれている機能です,コメント内のTODO,FIXMEと記述している箇所を一覧します。

リスト14

 % rake notes:todo
app/controllers/hellos_controller.rb:
  * [  5] implement

著者プロフィール

鎌田達哉(かまだたつや)

SI企業勤務。10年ほど前にはじめて自分で行ったプログラミングはRubyによるものであったが,語ってもにわかには信じてもらえないような紆余曲折を経て現在に至る。現在は,JVM上の言語実装に興味あり。ありがちですが,Scalaにはまり中。