【Rails】ルーティングのカスタム方法

はじめに

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

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


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

対象読者

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

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

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


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

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以外のcreate, 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のidがパス上にいらない場合は以下のようにresourcesをresourceに変更することによりplayerのidが必要なくなります。

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

collection

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

先にcollectionについて説明します。
player一覧のCSVを出力する機能をするcsv_exportという関数を作りたいとき以下のようにroutesファイルに記述してください。

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のルーティングは多岐にわたり、多くの高度な機能やオプションが存在します。
今後も本ブログで取り上げていくかもしれないので楽しみにしててください。