RESTとルーティング
RESTはRailsアプリケーションを開発する上での重要な概念。
RESTに基づくことでモデルを扱うコントローラの効率の良いパターンで記述しながらセキュリティに配慮した開発が行える。
リソースベースのルーティング
まずRESTとは、ネットワーク上に置かれたリソースを操作するアプリケーションの作成のスタイルのこと。
RESTとリソース
RailsのREST機能の中心はリソースベースのルーティングです。
RailsにはRESTフルに開発できる機能がある。
Railsにおけるリソースとはコントローラが扱う対象に名前をつけたもの。
リソース名を設定するにはroutes.rbにresourcesメソッドを一行追加すれば良いだけ。
引数にはresource名の複数形を指定する。
例えば会員情報をリソースとして扱うには
resouces :members
↑これだけでOK。これだけでMembersControllerに対して
7つのアクションのルーティングを設定することができる。
これをRESTフルなルーティング、またはリソースベースのルーティングと呼ぶ。
リソースを扱うコントローラは「リソース名の複数形+Controller」という名前にするのが基本。
リソースを扱うコントローラについて
リソースを扱うコントローラでは決まった名前のアクションが7つある。
この7つはCRUD(Create、Read、Update、Delete)を実装したものでもある。
- index:リソースの一覧を表示する(テーブルのレコード一覧を表示する)
- new:リソースを追加する(テーブルに新しいレコードを作成する)ためのフォームを表示する。
- create:リソースを作成する(テーブルに新しいレコードを作成する)
- show:リソースの属性を表示する(レコードの内容を表示する)
- edit:リソースを更新する(既存のレコードのカラムを更新する)ためのフォームを表示する
- update:リソースを更新する(既存のレコードのカラムを更新する)
- destroy:リソースを削除する(テーブルからレコードを削除する)
パスとHTTPメソッド
7つのアクションを呼び出すためにはパスとHTTPメソッドの組み合わせが必要。
リソースの集合を扱うindex、createアクションは同じURLになりHTTPメソッドで区別される。個別のリソースを扱うshow,update,destroyアクションも同じURLになりHTTPメソッドで区別される。
show,edit,update,destroyの各アクションを呼ぶときは
モデルの主キーを示すidパラメータが必要。このidパラメータはparams[:id]で取り出せる。
アクション | パス | HTTPメソッド |
---|---|---|
index | /members | GET |
show | /members/123 | GET |
new | /members/new | GET |
edit | /members/123/edit | GET |
create | /members | POST |
update | /members/123 | PATCH |
destroy | /members/123 | DELETE |
※リソース名はmembersにしています。
アクションの追加
7つのアクション以外にもリソースベースのルーティングでは任意のアクションを追加できる。
resoucesメソッドにブロックを渡し、ブロックの中で
「HTTPメソッドを表すメソッド アクション名」を記述する。
リソースの集合を表すアクションを追加するときは
collectionメソッドのブロックで囲む。また、個別のリソースを扱うアクションは、
memberメソッドのブロックで囲む※この例の場合がmemberなだけ
search,suspend, restoreの3つを追加する場合、
resources :members do
collection { get "search" } # メンバーの検索
member { patch "suspend", "restore" } # メンバーの停止・再開
end
getやpatchのようにHTTPメソッドを表すメソッドには複数のアクションを指定できる。
sesrchアクションは集合を扱うのでidパラメータは不要。suspend,restoreアクションは個別のリソースを扱うのでidパラメータが必須。
アクション | パス | HTTPメソッド |
---|---|---|
search | /member/search | GET |
suspend | /member/123/suspend | PATCH |
restore | /member/123/restore | PATCH |
アクションの追加には下記の様な書き方もできる。
resources :members do
get "search", on: collection
put "suspend", "restore", on: member
end
また、7つのアクションのうち特定のアクションを使わない場合は
onlyオプションやexceptオプションが使える。
リソースとパスの指定
リソースベースのルーティングを設定したらシンプルなパスの指定ができる。
パスを返すメソッド
resourcesメソッドでリソースを指定すると、
コントローラのアクションを表すパスを「リソース名_path」の形の
メソッドで取得できるようになる。「resources :members」では次のメソッドが使える
アクション | パスを返すメソッド | 戻り値の例 |
---|---|---|
index | members_path | /members |
show | member_path(member) | /members/123 |
new | new_member_path | /members/new |
edit | edit_member_path(member) | /members/123/edit |
create | members_path | /members |
uupdate | member_path(member) | /members/123 |
destroy | member_path(member) | /members/123 |
リソースの集合を扱うindexとcreateではmemberが複数形になってる。
個別のリソースを扱うshowなどは単数形。
パスを返すメソッドはビューでもコントローラでもどちらでも使える。
indexアクションへのリンクは下記。
link_to "会員情報", members_path
また、個別のリソースを扱うアクションへのパス(member_pathやedit_member_path)を得るには引数にモデルのオブジェクトを渡す必要がある。
そうすることでモデルのidがidパラメータになる。
showアクションへのリンクはこちら。
link_to @member.name, member_path(@member)
members_pathとmember_pathが返すパスは複数のアクションを表しているが、
アクションの区別はHTTPメソッドで行う。
link_to "削除", member_path(@member), method: :delete
もしsearch,suspend, restoreの3つを追加する場合は下記の通り。
アクション | パスを返すメソッド | 戻り値の例 |
---|---|---|
search | search_members_path | /member/search |
suspend | suspend_path(member) | /member/123/suspend |
restore | restore_path(member) | /member/123/restore |
オブジェクトでパスを表す
link_toメソッドの第二引数にモデルオブジェクトを渡すとmember_pathと同じパスに変換される。
link_to member.name, @member
link_to "削除", @member, method: :delete
edit,suspendのように個別のリソースを扱うアクションは
配列を使って[アクション名, オブジェクトで表せれる。
link_to "編集", [:edit, @member]
link_to "停止", [:suspend, @member], method: :patch
indexやnewアクションのようにidパラメータを取らないアクションでは
「◯◯_path」の「_path」をとった文字列をシンボルにしたものを使える。
link_to "会員一覧", :members
link_to "新規追加", :new_member
これらはredirect_toメソッドでも使える。
今日は長かったな、ここまでにしよう。
本記事は下記本の勉強記事です。初学者にとても良い本です。