こんにちは!フリーランスの桃太郎です。
RailsにはユーザがアクセスするページのURLに応じて処理を担当するアクションを決めるルーティングという仕組みがあります。そのルーティングにおいて、URLとアクションの紐付けに統一感をだすための設計思想であるRESTfulを実現する手段の一つが今回ご紹介するresourcesメソッドです。
この記事では、
- RESTfulな設計とは
- resourcesとは
という基本的な内容から、
- resourcesをネストする使い方
など応用的な内容についても解説していきます。resourcesメソッドの使い方について正しく理解し、必要な場面で使いこなすことができるように、わかりやすく解説します!
ルーティングの基本
まずはルーティングの基本について確認しておきましょう。
ルートとは
URLとアクションを紐付けるルーティングの仕組みを担当しているのは以下のファイルです。
(プロジェクトルート)/config/routes.rb より詳細にroutesについて確認しておきたい方は以下の記事を参考にしてみると良いでしょう。
RESTfulな設計とは
RESTfulな設計と聞いても初心者の方にはイメージがつかみにくいかと思います。具体的な例をまずはみて下さい。
# 処理に応じてURLが異なる例 example.com/product/showbag #商品一覧からバッグカテゴリーの詳細情報をみる example.com/product/editbag #商品一覧からバッグカテゴリーを編集する example.com/product/deletebag #商品一覧からバッグカテゴリーを削除する # 統一されたURL例 example.com/product/5 #bagの商品IDを’5’と仮定
上記の例を見比べてみると確かに統一されたURLの方が見た目がスッキリしていますよね。
しかしここで疑問が生まれます。統一されたURLだけで詳細/削除/編集などのアクションとどのように紐付けるのでしょうか。その答えはHTTPメソッド(GET,POST,PATCH,DELETE)とURLを組み合わせてアクションと紐付けることです。
以下の記事でもRESTfulについて詳細な解説を行なっていますので参考にして下さい。
resourcesとは
RESTfulな設計を実現するために開発者自身でHTTPメソッドとURLとアクションの紐付けを行うのは少々手間がかかります。
そこでresourcesメソッドの登場です。resourcesメソッドは上記の手間を省き、自動でRESTfulなルート定義を生成します。
書き方
resourcesメソッドはroutes.rbファイルで使用します。構文は以下の通りです。
[基本構文]
resources :name #nameはリソース名
リソース名は例えば商品を管理するテーブル名(products)など一覧取得や編集などを行う対象となるものを設定します。
使い方
それでは実際の使い方と自動生成されたルートの確認方法を解説します。リソース対象として仮のモデルクラス(Product)を作成し、次にルート定義、最後にルートの確認を行います。
#railsコマンドでモデル作成 $ rails g model product #routes.rbに以下の定義を追加 resources :products #自動生成されたルートを確認 $ rails routes
[rails routesコマンドの実行結果]
Prefix Verb URI Pattern Controller#Action products GET /products(.:format) products#index POST /products(.:format) products#create new_product GET /products/new(.:format) products#new edit_product GET /products/:id/edit(.:format) products#edit product GET /products/:id(.:format) products#show PATCH /products/:id(.:format) products#update PUT /products/:id(.:format) products#update DELETE /products/:id(.:format) products#destroy
実行結果の通り、resourcesメソッドを利用することでHTTPメソッド(Verb列)とURLとアクションが紐づいたルート定義が生成されていることを確認できたかと思います。
resourcesをネストする方法
オンラインショップにて商品それぞれに対して購入者のレビュー情報が付いているサイトをよく見かけます。そのシステムの内部では商品のモデルとレビューのモデルが存在し、それぞれの関係が商品1つに対して複数のレビューがひもづく関連性が存在します。
モデルクラスではそのような関連性をhas_manyやbelong_toなどで表現しますが、URLをRESTfulに設計する場合、どのようになるか少し想像してみてください。一例としては以下のような構成が考えられます。
# 商品のカテゴリーの下にそれぞれreviewが存在する /product/5/review /product/7/review
このようなURLの階層構造を設計するためにresourcesメソッドではネストよる記述が可能です。具体的には以下のようにroutes.rbに記述します。
resources :products do resources :reviews end
記述が終わりましたら、内容を保存し‘rails routes’コマンドでルート定義を確認しましょう。
実行結果
Prefix Verb URI Pattern Controller#Action product_reviews GET /products/:product_id/reviews(.:format) reviews#index POST /products/:product_id/reviews(.:format) reviews#create new_product_review GET /products/:product_id/reviews/new(.:format) reviews#new edit_product_review GET /products/:product_id/reviews/:id/edit(.:format) reviews#edit product_review GET /products/:product_id/reviews/:id(.:format) reviews#show PATCH /products/:product_id/reviews/:id(.:format) reviews#update PUT /products/:product_id/reviews/:id(.:format) reviews#update DELETE /products/:product_id/reviews/:id(.:format) reviews#destroy products GET /products(.:format) products#index POST /products(.:format) products#create new_product GET /products/new(.:format) products#new edit_product GET /products/:id/edit(.:format) products#edit product GET /products/:id(.:format) products#show PATCH /products/:id(.:format) products#update PUT /products/:id(.:format) products#update DELETE /products/:id(.:format) products#destroy
URLの階層構造が自動で生成されていることを確認できたかと思います。
まとめ
本記事ではresourcesメソッドについて基本的な書き方や使い方、さらにはresourcesのネストによる階層構造のルーティングを自動生成する方法をご紹介しました。
URLの設計は初学者にとって最初はとっつきにくい部分もあるかもしれませんが、resourcesメソッドを上手に活用することで基本的なルーティングが手軽に実装できることが理解いただけたかと思います。
もし、今後resourcesメソッドで使い方に迷うことがあれば、ぜひこの記事を思い出して下さいね。