【15日目:RESTについて概念を学ぶ】改訂3版基礎Ruby on Railsを読んだで!

シェアする

  • このエントリーをはてなブックマークに追加
41AkxXsz+5L._SX258_BO1,204,203,200_

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メソッドでも使える。

今日は長かったな、ここまでにしよう。

本記事は下記本の勉強記事です。初学者にとても良い本です。

スポンサーリンク
Sponsored Link
Sponsored Link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
Sponsored Link