【Rails】ルーティングの書き方と確認方法を解説!

Ruby on Railsで開発をしていると、ルーティングの書き方に迷ったり、既存のルーティングの確認方法に手間取ったりしませんか?

ルーティングの書き方は現役エンジニアになった今でも意外と迷いますし、確認に手間取ったりすることも多いです。

この記事を最後まで読めば、ルーティングの書き方と確認方法を基礎から実践的な使い方まで理解し、使いこなせるようになります。

この記事を書いているぼくは実務経験1年。独学で未経験から従業員300名以上の自社開発企業へ転職しました。実務ではVue.jsとRailsを毎日書いています。

この記事で解説するRailsのバージョンは7.1.3.4です!

目次

Railsのルーティングとは?

Railsのルーティングは、WebサイトのURLと、それに対応するRailsアプリケーションの処理(コントローラーのアクション)を紐づける仕組みです。

簡単にいえば「どのURLにアクセスしたら、どの処理を行うか」を定義したものです。

たとえばブログアプリで記事一覧を表示するページのルーティングは以下のようになります。

Rails.application.routes.draw do
  get '/articles', to: 'articles#index'
end

この設定により、/articlesというURLにアクセスすると、ArticlesControllerindexアクションが実行されます。

ルーティングの書き方【基礎編】

1. 基本的なルーティング

まずは最も基本的なルーティングの書き方から見ていきましょう。

Rails.application.routes.draw do
  get '/users', to: 'users#index'
end

これは、/usersというURLに GET リクエストがあった場合、UsersControllerindexアクションを実行するという意味です。

特定のユーザーのリソースを取得したいときは、以下のように:idを指定します。

Rails.application.routes.draw do
  get '/users/:id', to: 'users#show'
end

これは、/users/1というURLにGETリクエストがあった場合、UsersControllershowアクションを実行するという意味です。

このときparamsハッシュには{ id: '1' }が含まれます。

2. リソースベースのルーティング

Railsでは、複数のルーティングを簡単に設定できるresourcesメソッドが用意されています。

Rails.application.routes.draw do
  resources :users
end

この1行で、Railsの基本の7つのアクションに対応した、以下のルーティングが自動的に設定されます。

HTTPメソッドパスアクション用途
GET/usersusers#indexユーザーの一覧を取得
GET/users/newusers#new新規ユーザー作成画面を表示
POST/usersusers#create新規ユーザーの作成
GET/users/:idusers#show特定のユーザーを取得
GET/users/:id/editusers#editユーザー編集画面を表示
PATCH/PUT/users/:idusers#update特定のユーザーの更新
DELETE/users/:idusers#destroy特定のユーザーの削除
resourcesメソッドで定義されるルーティング

これを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/newprofiles#newプロフィール作成画面を表示
POST/profileprofiles#createプロフィールの作成
GET/profileprofiles#showプロフィールの表示
GET/profile/editprofiles#editプロフィール編集画面の表示
PATCH/PUT/profileprofiles#updateプロフィールの更新
DELETE/profileprofiles#destroyプロフィールの削除
resourceメソッドで定義されるルーティング

複数形の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選

ここまではルーティングの定義方法を紹介してきました。

しかし実際には、新たなルーティングの定義方法だけでなく、すでに定義されてあるルーティングが確認したくなる場面もかなり多いです。

そこでここからは、定義されているルーティングの確認方法を紹介します。

  1. http://localhost:3000/rails/info/routesでブラウザから確認
  2. rails routesコマンド + オプション
  3. 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エンジニアになりたいと考えている方向けにおすすめの技術書を紹介しています。

こちらの記事もぜひ読んでみてください。

あわせて読みたい
【実務経験1年以上向け】Rubyで設計を学べる技術書3選 Rubyで設計を学べる技術書を知りたくないですか?この記事ではRubyエンジニア向けにサンプルコードがRubyで書かれていて設計を学べる技術書を3つ紹介しています。自分に必要なのはどの1冊なのか、ぜひ考えてみてください。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

未経験でSESから従業員300名以上の自社開発企業に転職しました。業務や個人開発で直面した問題や、転職・学習の経験を発信していきます。

コメント

コメントする

目次