Ruby on Railsで開発をしていると、ルーティングの書き方に迷ったり、既存のルーティングの確認方法に手間取ったりしませんか?
ルーティングの書き方は現役エンジニアになった今でも意外と迷いますし、確認に手間取ったりすることも多いです。
この記事を最後まで読めば、ルーティングの書き方と確認方法を基礎から実践的な使い方まで理解し、使いこなせるようになります。
この記事を書いているぼくは実務経験1年。独学で未経験から従業員300名以上の自社開発企業へ転職しました。実務ではVue.jsとRailsを毎日書いています。
Railsのルーティングとは?
Railsのルーティングは、WebサイトのURLと、それに対応するRailsアプリケーションの処理(コントローラーのアクション)を紐づける仕組みです。
簡単にいえば「どのURLにアクセスしたら、どの処理を行うか」を定義したものです。
たとえばブログアプリで記事一覧を表示するページのルーティングは以下のようになります。
Rails.application.routes.draw do
get '/articles', to: 'articles#index'
end
この設定により、/articles
というURLにアクセスすると、ArticlesController
のindex
アクションが実行されます。
ルーティングの書き方【基礎編】
1. 基本的なルーティング
まずは最も基本的なルーティングの書き方から見ていきましょう。
Rails.application.routes.draw do
get '/users', to: 'users#index'
end
これは、/users
というURLに GET リクエストがあった場合、UsersController
のindex
アクションを実行するという意味です。
特定のユーザーのリソースを取得したいときは、以下のように:id
を指定します。
Rails.application.routes.draw do
get '/users/:id', to: 'users#show'
end
これは、/users/1
というURLにGETリクエストがあった場合、UsersController
のshow
アクションを実行するという意味です。
このときparams
ハッシュには{ id: '1' }
が含まれます。
2. リソースベースのルーティング
Railsでは、複数のルーティングを簡単に設定できるresources
メソッドが用意されています。
Rails.application.routes.draw do
resources :users
end
この1行で、Railsの基本の7つのアクションに対応した、以下のルーティングが自動的に設定されます。
HTTPメソッド | パス | アクション | 用途 |
GET | /users | users#index | ユーザーの一覧を取得 |
GET | /users/new | users#new | 新規ユーザー作成画面を表示 |
POST | /users | users#create | 新規ユーザーの作成 |
GET | /users/:id | users#show | 特定のユーザーを取得 |
GET | /users/:id/edit | users#edit | ユーザー編集画面を表示 |
PATCH/PUT | /users/:id | users#update | 特定のユーザーの更新 |
DELETE | /users/:id | users#destroy | 特定のユーザーの削除 |
これをresources
メソッドを使わずに定義するのは手間なのでかならず活用しましょう。
# resources メソッドを使わないとこんなに書かないといけない、、、
Rails.application.routes.draw do
get '/users', to: 'users#index'
get '/users/new', to: 'users#new'
post 'users', to: 'users#create'
get 'users/:id', to: 'users#show'
get 'users/:id/edit', to: 'users#edit'
patch 'users/:id', to: 'users#update'
put 'users/:id', to: 'users#update'
delete 'users/:id', to: 'users#destroy'
end
resourcesメソッドの一部だけを使いたい場合
またresources
メソッドで定義されるルーティングのうち、一部だけを使いたい・あるいは一部を除いて使いたい、というケースもあるでしょう。
そういった場面では次のように、:only
オプションや:except
オプションが利用できます。
# index と show だけ必要
Rails.application.routes.draw do
resources :users, only: [:index, :show]
end
# update と destroy 以外が必要
Rails.application.routes.draw do
resources :users, except: [:update, :destroy]
end
絶対に必要なものだけに絞った方が保守性の観点で優れています。
これらのオプションを用いて、実装に欠かせないルーティングのみを定義するようにしましょう。
捕捉:PATCH/PUTの注意点
先ほどのルーティング表を見ると、users#update
アクションはPATCH/PUT両方のメソッドに対応しています。
しかし、Rails4.0以降ではPATCHメソッドが推奨されています。
PUTメソッドもサポートしているのは歴史的な理由と後方互換性のためです。
リソース更新用のルーティングを定義する際は、原則としてPATCHを使うようにしましょう。
参考: Rails 3.2からRails 4.0へのアップグレード
3. 単数リソースのルーティング
たとえばログイン中のユーザー自身のプロフィールは、ユーザーに対して1つしか存在しません。
そういった単数形のリソースにはresources
ではなくresource
メソッドを使います。
Rails.application.routes.draw do
resources :profile
end
これにより、プロフィール関連のルーティングが設定されます。
HTTPメソッド | パス | アクション | 用途 |
GET | /profile/new | profiles#new | プロフィール作成画面を表示 |
POST | /profile | profiles#create | プロフィールの作成 |
GET | /profile | profiles#show | プロフィールの表示 |
GET | /profile/edit | profiles#edit | プロフィール編集画面の表示 |
PATCH/PUT | /profile | profiles#update | プロフィールの更新 |
DELETE | /profile | profiles#destroy | プロフィールの削除 |
複数形のresources
メソッドとの違いは下記の部分です。
:id
が存在しないindex
アクションが存在しない
ログイン中ユーザーのプロフィールは1つしかないため、:id
で識別する必要がありません。
同じ理由で複数の項目を一覧表示するindex
アクションのルーティングも生成されないです。
ルーティングの書き方【応用編】
ここまでで基本的なルーティングの書き方を紹介しました。
しかし実際の現場では/users
や/users/1
といったシンプルなルーティングばかりではありません。
そこでここからは、より複雑で実践的なルーティングの書き方を紹介します。
1. ネストしたリソース
リソースを他のリソース内にネストさせることができます。
たとえば、記事に対するコメントを表現する場合のルーティングは以下のとおりです。
Rails.application.routes.draw do
resources :articles do
resources :comments
end
end
これにより、/articles/1/comments
のようなURLが生成されます。
2つのリソースが親子関係となる際はこのルーティングをよく使います。
2. カスタムアクションの追加
リソースに標準以外のアクションを追加したい場合は以下のように書きます。
resources :articles do
member do
get 'preview'
end
collection do
get 'search'
end
end
これにより、基本の7つのルーティングに加えて、/articles/1/preview
や/articles/search
といったURLが使えるようになります。
ルーティングの確認方法3選
ここまではルーティングの定義方法を紹介してきました。
しかし実際には、新たなルーティングの定義方法だけでなく、すでに定義されてあるルーティングが確認したくなる場面もかなり多いです。
そこでここからは、定義されているルーティングの確認方法を紹介します。
http://localhost:3000/rails/info/routes
でブラウザから確認rails routes
コマンド + オプションrails routes
コマンド +grep
コマンド
順番に説明していきます。
1. http://localhost:3000/rails/info/routes でブラウザから確認
開発環境でhttp://localhost:3000/rails/info/routes
にアクセスすると、すべてのルーティング情報を見ることができます
検索窓に単語を打つとその文字列と一致・部分一致するルーティングが検索できます。
以下は検索窓にblog
と打った場合の表示です。
2.rails routes
コマンド + オプション
ターミナルで以下のコマンドを実行すると、ルーティング情報が表示されます。
sample % rails routes
Prefix Verb URI Pattern Controller#Action
entries GET /entries(.:format) entries#index
POST /entries(.:format) entries#create
new_entry GET /entries/new(.:format) entries#new
edit_entry GET /entries/:id/edit(.:format) entries#edit
entry GET /entries/:id(.:format) entries#show
PATCH /entries/:id(.:format) entries#update
PUT /entries/:id(.:format) entries#update
DELETE /entries/:id(.:format) entries#destroy
blogs GET /blogs(.:format) blogs#index
POST /blogs(.:format) blogs#create
new_blog GET /blogs/new(.:format) blogs#new
edit_blog GET /blogs/:id/edit(.:format) blogs#edit
blog GET /blogs/:id(.:format) blogs#show
PATCH /blogs/:id(.:format) blogs#update
PUT /blogs/:id(.:format) blogs#update
DELETE /blogs/:id(.:format) blogs#destroy
(略)
sample %
この方法は特定のコントローラーのルーティングを検索可能です。
その際はc
オプションを指定します。
sample % rails routes -c blogs
Prefix Verb URI Pattern Controller#Action
blogs GET /blogs(.:format) blogs#index
POST /blogs(.:format) blogs#create
new_blog GET /blogs/new(.:format) blogs#new
edit_blog GET /blogs/:id/edit(.:format) blogs#edit
blog GET /blogs/:id(.:format) blogs#show
PATCH /blogs/:id(.:format) blogs#update
PUT /blogs/:id(.:format) blogs#update
DELETE /blogs/:id(.:format) blogs#destroy
sample %
3. rails routes
コマンド + grep
コマンド
特定の文字列を含むルーティングを検索したい場合はgrep
コマンドとの併用も効果的です。
sample % rails routes | grep blog
blogs GET /blogs(.:format) blogs#index
POST /blogs(.:format) blogs#create
new_blog GET /blogs/new(.:format) blogs#new
edit_blog GET /blogs/:id/edit(.:format) blogs#edit
blog GET /blogs/:id(.:format) blogs#show
PATCH /blogs/:id(.:format) blogs#update
PUT /blogs/:id(.:format) blogs#update
DELETE /blogs/:id(.:format) blogs#destroy
おわりに
今回はRuby on Railsのルーティングについて解説しました。
ルーティングができないとRuby on Railsで開発することは不可能なので、しっかりマスターしておきましょう。
また、以下の記事ではワンランク上のRailsエンジニアになりたいと考えている方向けにおすすめの技術書を紹介しています。
こちらの記事もぜひ読んでみてください。
コメント