Railsのリソースとルーティングについて
今回はRailsの基礎の1つ、リソースについて書いていきます。
リソースとは?
Railsにおけるリソースについて、基礎Ruby on Rails
では以下のように書かれています。
Railsにおけるリソースとは、コントローラが扱う対象に名前をつけたものです。
コントローラが扱うものといえばモデル
だな!と思ったら、実際のところはセッション等も扱うので、モデルだけとは限らないと書かれていました。
つまり、モデル≒リソース
,モデルはリソースの1種として捉えるのが良さそうです。
モデルの他のリソースとしては、セッション
,画像
,ファイル
等が考えられます。
リソースのルーティングとは
ルーティングとは、動きだけ考えると色々なURIを作るやつ
というイメージ。
コレをちゃんと説明すると、それぞれのリソースに適した動作ができるURIを生成し、コントローラのアクションとのマッピングを行う
というのがルーティングの役目、と自分は解釈しています。
なので、REST
的に考えると、有るリソースに対して、表示する、作成する、編集する、削除する、のそれぞれの機能にあったユニークなURIを作るわけです。
例えば、ユーザー
というリソースがあれば、表示するshow
,新規作成するnew
, 編集するedit
, 削除するdestroy
の4つのURIを作るのがルーティングです。
つまり、URIというリソースの通り道
を作るわけですね。route
だけに。
このルーティングを行う場合、routes.rb
には以下のように記述します。
Rails.application.routes.draw do resources :user end
この記述をすることで、以下の様なルーティングができるわけです。
(今回、テスト用のRails5.0でやっていますので、Rails4~の方はrails routes
をrake routes
に置き換えてください)
$ rails routes Prefix Verb URI Pattern Controller#Action root GET / users#index users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy
単数リソースと複数リソース
先ほどの、resources :user
は複数リソース
です。
この他に、単数リソース
というものがあります。
先ほどの、userを単数リソースとして宣言する場合、コードは以下のようになります。
Rails.application.routes.draw do resource :usr end
生成されるURIパターンは以下のようになります。
$ rails routes Prefix Verb URI Pattern Controller#Action root GET / users#index user POST /user(.:format) users#create new_user GET /user/new(.:format) users#new edit_user GET /user/edit(.:format) users#edit GET /user(.:format) users#show PATCH /user(.:format) users#update PUT /user(.:format) users#update DELETE /user(.:format) users#destroy
どうちがうの?
users#showを比べてみます。
複数リソース | 単数リソース | |
---|---|---|
URI Pattern | /users/:id(.:format) | /user/(.:format) |
Controller#action | users#show | users#show |
見てわかる大きな違いはURI Patternで複数リソースには:id
があることです。
この:id
はユーザーのIDです。つまり、複数いるユーザーのうち1人ということを表しています。
単数リソースでは:id
はありません。なのでユーザーは1人しかいないということです。
このように必ず1つしかないリソースのルーティングをするときに、単数リソースを使います。
例えば、モデルはUsers
を使うんだけどログインしているユーザーのアカウントだけを扱うリソースaccount
が欲しい!という時に単数リソースが活用できます。
どこでつかうの?
最初に話にあげたセッション
や、次の話になるネストされたリソース
、先ほどのaccount
リソース等で使います。
とは言うものはRailsではそこまで多くはないと思います。
ちなみに、400行近いRedimineのroutes.rbを見てもresource
は1つしかありません。。
リソースのネスト
Rails、というよりもほぼすべてのアプリケーションのデータは親子関係(階層関係)を持つことがほとんどです。
例えば、ExcelのワークブックはWorkbook
というデータクラスの下にWorksheet
が有り、更にその下にCell
が有ります。
Railでも、has_many
,has_one
等でリソースの親子関係を作ることが有ります。
例として、「複数のユーザーがいて、それぞれのユーザーは、複数の本を持つ」という親子関係をルーティングしてみます。
イメージとしては、こういう感じです。
コードとしては以下のようになります。
Rails.application.routes.draw do resources :users do resources :books end end
このコードが生成するURIパターンは、以下のようになります。
$ rails routes Prefix Verb URI Pattern Controller#Action user_books GET /users/:user_id/books(.:format) books#index POST /users/:user_id/books(.:format) books#create new_user_book GET /users/:user_id/books/new(.:format) books#new edit_user_book GET /users/:user_id/books/:id/edit(.:format) books#edit user_book GET /users/:user_id/books/:id(.:format) books#show PATCH /users/:user_id/books/:id(.:format) books#update PUT /users/:user_id/books/:id(.:format) books#update DELETE /users/:user_id/books/:id(.:format) books#destroy users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#delete
books#show
のURIパターンを見ると、:user_id
で特定のユーザーを示し、その下に/books/:id
でそのユーザーが持つ特定の本を表示する、という風にURIが作られているのがわかると思います。
こういうわかりやすいURIを作るのがREST
なのです。
RESTの一部を無効化する
index
,show
,edit
,delete
がすべてできることをRESTFul
と言いますが、この内幾つかの項目は必要ないこともあります。
例えば、ネストしたリソースはindex
,show
だけできればいい、もしくはdelete
,destroy
はいらない、ということは良く有ります。
そういうときは、only
,except
オプションを使うことで実現できます。
index, showアクションのみ
Rails.application.routes.draw do resources :users, only:[ :index, :show ] end
Prefix Verb URI Pattern Controller#Action Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index user GET /users/:id(.:format) users#show
delete,destroy以外のアクション
Rails.application.routes.draw do resources :users, except: [:delete, :destroy] end
Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update
いつ使うの?
例えば、セッション
のリソースでは、show
もupdate
も必要ありませんよね。作る、廃棄する、の2つだけで十分です。
こういう時に、only:[ :create, :destroy ]
の2つのアクションだけを持つリソースを作れます。
また、ネストしたリソースでは、ユーザーのアカウント画面では新規作成と削除はできないといった事が必要になります。
そういった時に使うことができます。
参考文献
- 作者: 黒田努,佐藤和人
- 出版社/メーカー: インプレス
- 発売日: 2015/05/29
- メディア: Kindle版
- この商品を含むブログを見る
Ruby on Rails 4 アプリケーションプログラミング
- 作者: 山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2014/04/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る