routes.rbに色々なルーティングを定義したRailsアプリを作ってみた

先日 Railroads という、Rails開発向けのIntelliJ Platform Pluginを作りました。
RubyMine 2023.3系から、rails routes を便利に扱える Railways プラグインが動かなくなったので、代替プラグイン Railroads を作りました - メモ的な思考的な

 
そのプラグインの動作確認をするために

  • rails routes を実行し、設定したルーティグがどのように表示されるか確認
  • rails routes の結果を元に、Railroadsプラグインでコントローラとメソッドが表示されているか確認

ができるRailsアプリが必要になりました。

 
そこで、 routes.rb に色々なルーティングを設定したRailsアプリを作ってみたことから、メモを残します。

 
なお、今回定義したRailsアプリのルーティングについては、 Railroads プラグインでの確認に加え、ブラウザでの表示 (http://localhost:3000/rails/info/routes) でも確認しています。
6.1 既存のルールを一覧表示する | Rails のルーティング - Railsガイド

 
目次

 

環境

 

今回実装したルーティング一覧

Railsガイドに書かれている各種ルーティングを実装してみました。
Rails のルーティング - Railsガイド

 
具体的には以下を実装しました。

 
以降は作ったときのメモです。

 

メモ

resource とresources は同じコントローラにマッピングされる

Railsガイドに記載がありました。

単数形リソースは複数形のコントローラに対応付けられます。これは、同じコントローラで単数形のルーティング(/account)と複数形のルーティング(/accounts/45)を両方使いたい場合を想定しているためです。従って、resource :photoとresources :photosのどちらも、単数形ルーティングと複数形ルーティングを両方作成し、同一のコントローラ(PhotosController)に割り当てられます。

2.5 単数形リソース | Rails のルーティング - Railsガイド

 

resource (単数形ルーティング) には :id がない

単数形ルーティングの用途は以下のため、 :id がないようです。

ユーザーがページを表示する際にidを一切参照しないリソースが使われることがあります。たとえば、/profileでは常に「現在ログインしているユーザー自身」のプロファイルを表示し、他のユーザーidを参照する必要がないとします。

2.5 単数形リソース | Rails のルーティング - Railsガイド

 

浅いネストという書き方がある

2.7.2 浅いネスト | Rails のルーティング - Railsガイド によると、こんな感じで書けるようです。

resources :parents, shallow: true do
  resources :children
end

 
ルーティングを確認してみたところ、Railsガイドの

コレクション(index/new/createのような、idを持たないもの)のアクションだけを親のスコープの下で生成するという手法があります

というルーティングになっていました。

 
また、 shallow について調べたところ、以下にまとまっている通り、賛否両論あるようでした。
Railsの”shallow(浅い)”ルーティングを理解する #Rails - Qiita

 

ルーティングにも concern がある

concern を使ってルーティングを書きます。

concern :image_attachable do
  resources :images, only: :index
end
resources :news, concerns: :image_attachable, only: :index

 
すると、ルーティングは以下になりました。

news の下に images というルーティングができる一方、コントローラは ImagesController になりました。

 

match + via の場合、rails routes の HTTP Verb が まとめて表示される

以下のRailsガイドにあるように、 match + via で定義した場合、 rails routes の表示が他と HTTP Verb 列の表示が異なります。
3.7 HTTP verbを制限する | Rails のルーティング - Railsガイド

 
例えば、

match '/multiple_match', to: 'multiple#call', via: [:get, :post]

と定義した場合、rails routes では HTTP Verb が GET|POST のように表示されます。

ちなみに、Railroadsプラグインの作成当初、このことに気づかず「Railways プラグインとルーティングの数が合わない...」と悩みました。

 

ソースコード

Githubに上げました。
https://github.com/thinkAmi-sandbox/rails_routes_app

プルリクは以下の2つです。