先日 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ガイド
具体的には以下を実装しました。
- 2.2 CRUD、verb、アクション | Rails のルーティング - Railsガイド
- 2.5 単数形リソース | Rails のルーティング - Railsガイド
- 2.6 コントローラの名前空間とルーティング | Rails のルーティング - Railsガイド
- 2.7 ネストしたリソース | Rails のルーティング - Railsガイド
- 2.7.2 浅いネスト | Rails のルーティング - Railsガイド
- 2.8 ルーティングの「concern」機能 | Rails のルーティング - Railsガイド
- 2.10.1 メンバールーティングを追加する | Rails のルーティング - Railsガイド
- 2.10.2 コレクションルーティングを追加する | Rails のルーティング - Railsガイド
- 2.10.3 追加されたnewアクションへのルーティングを追加する | Rails のルーティング - Railsガイド
- 3.7 HTTP verbを制限する | Rails のルーティング - Railsガイド
- 3.12 リダイレクト | Rails のルーティング - Railsガイド
- 3.13 Rackアプリケーションにルーティングする | Rails のルーティング - Railsガイド
- 3.14 rootを使う | Rails のルーティング - Railsガイド
- 3.16 ダイレクトルーティング(Direct routes) | Rails のルーティング - Railsガイド
以降は作ったときのメモです。
メモ
resource とresources は同じコントローラにマッピングされる
Railsガイドに記載がありました。
単数形リソースは複数形のコントローラに対応付けられます。これは、同じコントローラで単数形のルーティング(/account)と複数形のルーティング(/accounts/45)を両方使いたい場合を想定しているためです。従って、resource :photoとresources :photosのどちらも、単数形ルーティングと複数形ルーティングを両方作成し、同一のコントローラ(PhotosController)に割り当てられます。
resource (単数形ルーティング) には :id がない
単数形ルーティングの用途は以下のため、 :id
がないようです。
ユーザーがページを表示する際にidを一切参照しないリソースが使われることがあります。たとえば、/profileでは常に「現在ログインしているユーザー自身」のプロファイルを表示し、他のユーザーidを参照する必要がないとします。
浅いネストという書き方がある
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つです。