RESTful Ruby on Rails -- 単数と複数
前回の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 の世界に移るべきなのでしょうか。
私の結論を先に言えば、「移るべし」なのですが、その理由を説明するのは別の機会に。
--
黒田努
(2008/04/24)
記事に関するご質問は、 hermes@oiax.jp までメールでお送りください。
ウェブサイト構築の発注先を検討されているお客様は、ご相談フォームをご利用ください。
- はじめに
- Rails はエンタープライズの世界で主流になるか (2008/03/29)
- Rails 2.0 ベンチマーク (2008/03/30)
- テスト駆動開発とデバッグコード (2008/04/07)
- Git or Mercurial (2008/04/22)
- RESTful Ruby on Rails -- その美しさと難しさ (2008/04/23)
- RESTful Ruby on Rails -- 単数と複数 (2008/04/24)
- Rails のソースコードを読む (2008/05/02)
- sudo: no passwd entry for app! (Capistrano 2.3.0) (2008/05/12)
- Rails on GlassFish (2008/06/18)
- 「Ruby は型宣言がないけど、ちゃんとしたシステムに使えるのか」という質問にどう答えるか (2008/11/23)
- 「Ruby はスクリプト言語だけど、遅くないですか」という質問にどう答えるか (2008/11/24)
- どのプログラミング言語が将来的に有望か (2009/01/10)
- どのフレームワークが将来的に有望か (2009/01/11)
- フレームワーク対 CMS (2009/01/12)
- Rails 2.3 で spawner/reaper は DEPRECATED に (2009/03/25)
- db/seeds.rb (2009/06/08)
- LESSとSass (2009/08/03)
- Rails 2.3.4 と I18n (2009/08/15)
- RubyGems のアップデート(上書きインストール) (2010/02/03)
- クリエイティブ・コモンズの Rails 教材 (2010/03/08)
- Yet Another Ruby Reference (2010/03/12)
- Rails で MongoDB を使ってみた (2010/03/23)
- Rails で MongoDB を使ってみた(2) (2010/03/25)
- 祝 Ruby on Rails 3.0 beta2 リリース (2010/04/02)
- Rails 3.x 時代のテストフレームワーク (2010/04/24)
- 続・Rails 3.x 時代のテストフレームワーク (2010/05/06)
- Test::Unit と RSpec と Shoulda (2010/05/06)
- Windows + Rails + MySQL 5.1 (2010/07/20)

