スライドショー

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

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

RailsにはユーザがアクセスするページのURLに応じて処理を担当するアクションを決めるルーティングという仕組みがあります。そのルーティングにおいて、URLとアクションの紐付けに統一感をだすための設計思想であるRESTfulを実現する手段の一つが今回ご紹介するresourcesメソッドです。

この記事では、

  • RESTfulな設計とは
  • resourcesとは

という基本的な内容から、

  • resourcesをネストする使い方

など応用的な内容についても解説していきます。resourcesメソッドの使い方について正しく理解し、必要な場面で使いこなすことができるように、わかりやすく解説します!

ルーティングの基本

まずはルーティングの基本について確認しておきましょう。

ルートとは

URLとアクションを紐付けるルーティングの仕組みを担当しているのは以下のファイルです。

(プロジェクトルート)/config/routes.rb より詳細にroutesについて確認しておきたい方は以下の記事を参考にしてみると良いでしょう。

【Rails入門】ルーティング (config/routes.rb)の書き方を説明!
更新日 : 2019年7月31日

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について詳細な解説を行なっていますので参考にして下さい。

【Rails入門】初めてのWebアプリ開発ならscaffoldが最短!
更新日 : 2018年8月21日

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

湯浅 桃太郎

湯浅 桃太郎

20代は役者、30代はエンジニア、そして40代を迎えた現在、Webライターとして活動しながら、3人の息子たちの家庭教育、アンチエイジングなどにも力を入れて日々ノマドライフを楽しんでいます。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説