
【Rails】ルーティングのカスタマイズ方法
はじめに
こんにちは、株式会社TOKOSの石津です!
今回はRailsのroutes.rbファイル内でルーティングをカスタマイズする方法について説明していきます。
多くのRailsアプリケーションでは、resourcesやrootといった基本的なルーティングメソッドを使用することで、簡単に複数のアクションを生成できます。
これらの基本的なルーティング設定も非常に役に立ちますが、さらにカスタマイズしてより複雑なリクエストに応答する動的なルートを作成することも可能です。
この記事では、Railsのroutes.rbファイルの様々なカスタマイズ方法について説明していきます。
「ルーティングの変更方法」や「resourcesで作られるデフォルトCRUDアクション以外の新たなアクションの追加方法」などを探しているRailsの初心者から中級者の方に参考になると嬉しいです。
対象読者
- Railsを学び始めた初心者
- 学校やオンラインコースでWeb開発を学んでいる人や、独学でWeb技術を身につけようとしている人
- Railsのルーティングについて知りたい人
controllerにresources以外の新しいアクションを追加したい人
resourcesを用いた基本的なルーティングの確認
まずはみなさんが普段行っているであろうresourcesを用いたルーティング方法について確認していきます。
今回はplayerコントローラーで用いるアクションを設定していきます。
routes.rbファイルに以下のように記述してください。
Rails.application.routes.draw do
resources :players
endターミナルで確認してみてください。
基本的なCRUDアクションが作成されているかと思います。
今回はこのplayerコントローラーのルーティングをカスタマイズしていきます。
ルーティングのカスタマイズ
ここからはルーティングのカスタマイズ方法について説明していきます。
only
onlyを使うことによってresourcesで作られるアクションを制限できます。
今回はindexとshow以外のアクションを作りたくないのでこのように書いてみました。
Rails.application.routes.draw do
resources :players, only: [:index, :show]
endターミナルを確認します。
index、show以外のnew、create、edit、update、destroyが削除されているのが確認できます。
ネスト
Railsではdo endで囲うことによってルーティングをネストできます。
player配下にweaponを作ってみましょう。
Rails.application.routes.draw do
resources :players do
resources :weapons
end
endターミナルを確認します。
weaponのパスがplayer配下に作られているのが確認できます。
使用例としてidが1のplayerの武器を一覧表示したい時などに/players/1/weaponsというパスとして使うことができます。
playerがアプリケーション内に1つしか存在しないリソース(例: ログインユーザー自身のプロフィールなど)の場合は、以下のようにresourcesをresourceに変更します。resourceではパスに:idが含まれなくなります。
Rails.application.routes.draw do
resource :players do
resources :weapons
end
endcollection
resourcesで作られるアクション以外のアクションを独自で作りたい時にはcollectionと次に説明するmemberを使うことができます。
まずはcollectionについて説明します。
player一覧をCSV出力するcsv_exportというアクションを作りたいとき以下のようにroutes.rbファイルに記述してください。
Rails.application.routes.draw do
resource :players do
get :csv_export, on: :collection
end
endターミナルを確認します。
resourcesで作られるアクションとは別に新しくcsv_exportというアクションが追加されたのが確認できると思います。
今回はVerbがGETのアクションを追加しましたが、アクションの前に記述するVerbは任意のものに変更できます。
今回はPOSTに変更してみます。
以下のようにroutesファイルを変更します。
Rails.application.routes.draw do
resource :players do
post :csv_export, on: :collection
end
endターミナルを確認します。
csv_exportアクションのVerbがPOSTに変更されているのが確認できました。
member
memberはcollectionと同様に新しいアクションを作成したい場合に使います。
collectionと異なる点としてidが必要な場合はmemberを使います。
playerの例で説明するとplayer一覧をCSV出力したい場合はcollectionでcsv_exportアクションを作成し、ある一人のplayer情報をCSV出力したい場合はmemberでcsv_exportアクションを作成するといった使い方をします。
では今回はmemberでcsv_exportアクションを作成してみます。
Rails.application.routes.draw do
resource :players do
get :csv_export, on: :member
end
endターミナルを確認します。
見比べやすいようにcollectionで作成したものも貼っておきます。
URI Patternを見るとmemberで作った場合はplayerとcsv_exportの間にidがあるのが分かると思います。
おわりに
今回の記事ではRailsでルーティングをカスタマイズする方法を説明しました。
onlyによるアクションの制限やルーティングのネスト化、collectionとmemberによるアクションの追加などを説明しました。
ルーティングをカスタマイズすることで、URL構造をより直感的で使いやすく、保守しやすくできます。
もちろん、今回取り上げた内容はルーティングの氷山の一角に過ぎません。
Railsのルーティングは多岐にわたり、多くの高度な機能やオプションが存在します。
今後も本ブログで取り上げていくかもしれないので楽しみにしていてください。
この記事を書いた人
-