【Rails入門】resourcesの使い方まとめ

こんにちは!フリーランスの桃太郎です。

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メソッドで使い方に迷うことがあれば、ぜひこの記事を思い出して下さいね。

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次