Filtered Subresource パターン

/users/admin

Filtered Collection パターンのうち、汎用的なものであれば、子リソースとしても表現できる。コレクションリソースの一種。

ただし、メンバーリソースのIDと衝突する可能性があるので注意しなければならない。(これも補助リソースのように命名規則が欲しいところ)

使用メソッド

基本的にGETのみ。

Rails routes.rb の書き方

resources :users do
  collection do
    get :admin
  end
end

Filtered Collection パターン

/users?role=admin
/users?page=2
/users?since_id=123

どのようなパターン?

コレクションリソースにアルゴリズムリソースを組み合わせて用いる形。

コレクションリソースから、クエリパラメータの値を条件として絞り込んだリソースを表す。

RailsのGemでは、「検索」としては Ransack (meta_search) などが実装している。 「ページネーション」としては kaminari などが実装している。

リソースの分類からみる

アルゴリズムリソース

/search?q={query}
/conversion?from=USD&to=JPY&amount=100

クエリパラメータによって、何らかのアルゴリズムを実行した結果のリソース。

使用メソッド

基本的にGETのみ。

クエリパラメータが長すぎる場合はPOST(overloaded POST)を使用することもある。

Singular (Singleton) Resource パターン

/profile

どのようなパターン?

同じ種類がたくさんあるコレクションリソースに対して、ただ1つしかないリソース(単数リソース)のパターン。

使用メソッドとの組み合わせ

Railsのアクション名を例に挙げる。

GET POST PUT DELETE
/{name} show create update destroy

リソースの分類からみる

単数 (Singleton, Singular) リソース

/{name}

ただ1つしかないリソース。

グローバルに1つしかない

/status

サービスの状態を表す (id:bekkou68 さんのコメントより)

あるリソースに対して1つしかない

/users/123/profile

セッションに対して1つしかない

/my/profile

→ Private Resource パターン

Rails routes.rb の書き方

# /profile の場合
resource :profile

Collection & Member Resource パターン

/users
/users/123

どのようなパターン?

コレクションリソースとメンバーリソースの2種類のリソースをひとまとめとして扱い、使用するメソッドを限定する。

コレクションリソースがFactoryの役割も果たす。

Railsのリソース設計では基本となるパターンであり、9割方これで済むといっても過言ではない。(なので用途を絞った派生パターンを考えていく必要がある:Transaction Resource パターンなど)

使用メソッドとの組み合わせ

Railsのアクション名を例に挙げる。

GET POST PUT DELETE
/{name} index create - -
/{name}/{id} show - update destroy

すべてを使うことはまれなため、8種類中5種類に使用を限定しているのがポイント。

リソースの分類からみる

/{name} (コレクションリソース)
/{name}/{id} (メンバーリソース)

同じ種類のデータのまとまりを「コレクションリソース」、その中の個別のデータを「メンバーリソース」と呼ぶ。

コレクション名に“/”でIDをつなげることで階層構造とする点が特徴。

GET /users 

ユーザ全体を取得。

POST /users

新しいユーザのリソースを作成(Factory)。

主なステータス:201 Created, 302 Found, 303 See Other

GET /users/123

ID=123のユーザのリソースを取得。

PUT /users/123

ID=123のユーザのリソースを変更。

DELETE /users/123

ID=123のユーザのリソースを削除。

補助リソース

/{name}/new
/{name}/{id}/preview

主にHTMLのUIのために必要となる、データの中身には関係のないリソース。

Railsresourcesを使用すると、上記の5種類のアクションに加えて、new, editの2つのアクションが作られる。これが補助リソースである。

あくまでフォームを表示するだけのリソースであるため、実装によっては必要ない。

メンバーリソースのIDと衝突しないように注意。_newのようにアンダースコアをつけるなどの命名規則を導入すれば回避できる。

Rails routes.rb の書き方

# /users
# /users/id の場合
resources :users