RailsでのURL設計を考えてみる(5) Railsのリソースパターン
URL設計の前段階として、とても大切なのがリソース設計です。そのWebアプリ・Webサービスで何を提供するのかが決まる部分だからです。しかし、なかなかリソースという概念が定着していないようなので、Railsで採用されているパターン*1を例に挙げて紹介してみたいと思います。
今までのシリーズ記事と重なるところもありますが、まとめということで…。
リソースとは
簡単に言うと、「URLで示されるもの」です。URLというのが“Uniform Resource Locator”の略ですからね。
http://d.hatena.ne.jp/tkawa/20110819/p1 http://d.hatena.ne.jp/tkawa/20110819
最初のものは、前回書いたブログ記事『RailsでのURL設計を考えてみる(4) スラッシュと「持っている」関係』というリソースです。
その次は、『tkawaが2011年8月19日に書いたブログ記事』というリソースです。実際には中身の記事は1つしかないのですが、もし複数の記事があれば列挙されることになります。
これに限らず、URLで示すことができる情報はすべてリソースです。URLはリソースにつけられた名前ともいえます*2。
Railsで用意されているパターン
すべてがリソースなのでいろいろな種類がありうるのですが、その中でも典型的なパターンがいくつか存在します。Railsでは、そのパターンに沿って設計すると簡単に書けるようになっています。
MemberリソースとCollectionリソース
Memberリソースは一番基本となるリソースです。1個のオブジェクトや、データベースの1レコードを指すというイメージです。
このようなURLがMemberリソースの例です。
http://d.hatena.ne.jp/tkawa/20110819/p1 http://baseball.example.jp/leagues/central http://railsapp.example.com/users/12
Collectionリソースは、Memberリソースを種類ごとにまとめたもので、ちょうどディレクトリ(フォルダ)のようなイメージです。
例はこのようなURLです。
http://d.hatena.ne.jp/tkawa/20110819 http://baseball.example.jp/leagues http://railsapp.example.com/users
見ると気づきますが、Memberリソースの末尾を削ったものになっています。言い換えると、Collectionリソースの後ろにスラッシュ区切りでIDをくっつけることで、MemberリソースのURLになります。
Member, CollectionリソースのURLの構造*3
/{collection_name}/{id} /{collection_name}
Collectionリソースの名前(collection_name)は名詞の複数形が推奨されます。Memberリソースの名前(id)は、そのリソースをCollection内で一意に特定できる名前、もしくは番号です。
Singular(単数)リソース
Singularリソースは、Memberリソースと似ていますが、ただ1つしかないリソースです。これはグローバルに1つしかないという場合のほかにも、あるMemberリソースに1対1で結びついている場合、セッションなどの暗黙のパラメータに対して1つしかない場合も含まれます。
例はこのようなURLです。
http://b.hatena.ne.jp/tkawa/config http://railsapp.example.com/users/12/profile http://u2plus.jp/user
最後の例は、僕が制作に関わっているサービスのU2plusの例なのですが、“/user
”で「現在ログインしているユーザ」というリソースを指すことにしています。これはセッションに対して1つしかないリソースになっています。
Singularリソースの名前は、名詞の単数形が推奨されます。
routes.rbの書き方
上記のパターンに従えば、routes.rbの書き方はとても簡単です。
Memberリソース、Collectionリソースの場合
resources :users
これで、“/users
”というCollectionリソースと、“/users/{id}
”というMemberリソースができます。
Singularリソースの場合
resource :user
これで、“/user
”というSingularリソースができます。
組み合わせ
組み合わせるときも、このようにネストするだけです。
resources :users do resource :profile end
これで、“/users
”、“/users/{id}
”に加えて、“/users/{id}/profile
”というSingularリソースができます。