旧ブログ(ISSEN)から移行しました

【Rails】ルーティングのカスタマイズ方法

【Rails】ルーティングのカスタマイズ方法

石津敬浩
石津敬浩5分で読めます

はじめに

こんにちは、株式会社TOKOSの石津です!

今回はRailsのroutes.rbファイル内でルーティングをカスタマイズする方法について説明していきます。
多くのRailsアプリケーションでは、resourcesrootといった基本的なルーティングメソッドを使用することで、簡単に複数のアクションを生成できます。
これらの基本的なルーティング設定も非常に役に立ちますが、さらにカスタマイズしてより複雑なリクエストに応答する動的なルートを作成することも可能です。

この記事では、Railsのroutes.rbファイルの様々なカスタマイズ方法について説明していきます。
「ルーティングの変更方法」や「resourcesで作られるデフォルトCRUDアクション以外の新たなアクションの追加方法」などを探しているRailsの初心者から中級者の方に参考になると嬉しいです。

対象読者

  • Railsを学び始めた初心者
  • 学校やオンラインコースでWeb開発を学んでいる人や、独学でWeb技術を身につけようとしている人
  • Railsのルーティングについて知りたい人
  • controllerresources以外の新しいアクションを追加したい人

resourcesを用いた基本的なルーティングの確認

まずはみなさんが普段行っているであろうresourcesを用いたルーティング方法について確認していきます。
今回はplayerコントローラーで用いるアクションを設定していきます。

routes.rbファイルに以下のように記述してください。

config/routes.rb
Rails.application.routes.draw do
  resources :players
end

ターミナルで確認してみてください。

基本的なCRUDアクションが作成されているかと思います。
今回はこのplayerコントローラーのルーティングをカスタマイズしていきます。

ルーティングのカスタマイズ

ここからはルーティングのカスタマイズ方法について説明していきます。

only

onlyを使うことによってresourcesで作られるアクションを制限できます。
今回はindexshow以外のアクションを作りたくないのでこのように書いてみました。

config/routes.rb
Rails.application.routes.draw do
  resources :players, only: [:index, :show]
end

ターミナルを確認します。

indexshow以外のnewcreateeditupdatedestroyが削除されているのが確認できます。

ネスト

Railsではdo endで囲うことによってルーティングをネストできます。
player配下にweaponを作ってみましょう。

config/routes.rb
Rails.application.routes.draw do
  resources :players do
    resources :weapons
  end
end

ターミナルを確認します。

weaponのパスがplayer配下に作られているのが確認できます。
使用例としてidが1のplayerの武器を一覧表示したい時などに/players/1/weaponsというパスとして使うことができます。
playerがアプリケーション内に1つしか存在しないリソース(例: ログインユーザー自身のプロフィールなど)の場合は、以下のようにresourcesresourceに変更します。resourceではパスに:idが含まれなくなります。

config/routes.rb
Rails.application.routes.draw do
  resource :players do
    resources :weapons
  end
end

collection

resourcesで作られるアクション以外のアクションを独自で作りたい時にはcollectionと次に説明するmemberを使うことができます。

まずはcollectionについて説明します。
player一覧をCSV出力するcsv_exportというアクションを作りたいとき以下のようにroutes.rbファイルに記述してください。

config/routes.rb
Rails.application.routes.draw do
  resource :players do
    get :csv_export, on: :collection
  end
end

ターミナルを確認します。

resourcesで作られるアクションとは別に新しくcsv_exportというアクションが追加されたのが確認できると思います。

今回はVerbGETのアクションを追加しましたが、アクションの前に記述するVerbは任意のものに変更できます。
今回はPOSTに変更してみます。
以下のようにroutesファイルを変更します。

config/routes.rb
Rails.application.routes.draw do
  resource :players do
    post :csv_export, on: :collection
  end
end

ターミナルを確認します。

csv_exportアクションのVerbPOSTに変更されているのが確認できました。

member

membercollectionと同様に新しいアクションを作成したい場合に使います。
collectionと異なる点としてidが必要な場合はmemberを使います。

playerの例で説明するとplayer一覧をCSV出力したい場合はcollectioncsv_exportアクションを作成し、ある一人のplayer情報をCSV出力したい場合はmembercsv_exportアクションを作成するといった使い方をします。
では今回はmembercsv_exportアクションを作成してみます。

config/routes.rb
Rails.application.routes.draw do
  resource :players do
    get :csv_export, on: :member
  end
end

ターミナルを確認します。

見比べやすいようにcollectionで作成したものも貼っておきます。

URI Patternを見るとmemberで作った場合はplayercsv_exportの間にidがあるのが分かると思います。

おわりに

今回の記事ではRailsでルーティングをカスタマイズする方法を説明しました。
onlyによるアクションの制限やルーティングのネスト化、collectionmemberによるアクションの追加などを説明しました。
ルーティングをカスタマイズすることで、URL構造をより直感的で使いやすく、保守しやすくできます。
もちろん、今回取り上げた内容はルーティングの氷山の一角に過ぎません。
Railsのルーティングは多岐にわたり、多くの高度な機能やオプションが存在します。
今後も本ブログで取り上げていくかもしれないので楽しみにしていてください。

この記事を書いた人