RESTful Ruby on Rails -- 単数と複数

2008/04/24

前回のRESTful Ruby on Rails -- その美しさと難しさで、Rails における REST の世界は抽象度が高くて難解だ、ということを書きました。

今回は、Rails の REST が日本人にとって特に難しい理由について。

それは、英単語の単数と複数の違いを常に意識しなくてはならない、ということ。

もちろん、REST の概念が導入される前から Rails によるアプリケーション開発で、私たちは company と companies の違いを意識してきました。

テーブル名なら companies で、モデル名なら Company。

でも、これは非常に基本的な約束事であって丸暗記すれば済んでしまいます。しかし、REST の世界では、この文脈においてアプリケーションが扱っているこのリソースは集合的(collective)か個別的(individual)か、と考えた上で英単語を単数形と複数形のいずれで表記するのかを決定しなければなりません。

例えば、config/routes.rb に次のように書いて、companies というリソースを設定しましょう。

ActionController::Routing::Routes.draw do |map|
  map.resources :companies
end

すると、ID 123 の Company オブジェクトを表示するための URL パスは /companies/123 となり、この URL パスを生成するヘルパーメソッド company_path(company) が定義されます。

他方、Company オブジェクトのリストを表示するための URL パスは /companies となり、この URL パスを生成するヘルパーメソッド companies_path も定義されます。

company_path(company)companies_path の違い!

言語的に単数形と複数形の区別を持たない日本人には、なかなか厄介です。

さらに、config/routes.rb を書き換えて、companies の下に divisions というリソースをネストさせてみましょう。

ActionController::Routing::Routes.draw do |map|
  map.resources :companies do |company|
    company.resources :divisions
  end
end

今度は、ID 99 の Division オブジェクトを表示するための URL パスは /companies/123/divisions/99 となり、この URL パスを生成するヘルパーメソッド company_division_path(company, division) が定義されます。

そして、ID 123 の Company オブジェクトに属する Division オブジェクトの一覧ページの URL パスは /companies/123/divisions となり、この URL パスを生成するヘルパーメソッドは company_divisions_path(company) になるのです!

ちょっとしたパズルのようではありませんか。

こんなにややこしい仕組みを理解する苦労をしてまで、私たちは REST の世界に移るべきなのでしょうか。

私の結論を先に言えば、「移るべし」なのですが、その理由を説明するのは別の機会に。
--
黒田努