コンテンツにスキップ

rigor-rails-routes

config/routes.rbをPrismで静的に解釈し(Railsランタイムへの依存はありません)、Railsが生成するであろうルートヘルパーテーブルを構築して、すべての*_path / *_url呼び出し箇所をそれに照らして検証します。不明なヘルパーは(did-you-mean候補つきで)指摘され、引数の個数が誤っている場合も同様です。モデル↔ルートの活用変化には本物のActiveSupport::Inflectorを使うため、不規則な名前もRailsが解決するのと同じように解決されます。

このプラグインはrigortypeにバンドルされて提供されます。plugins:の下で有効化してください。

plugins:
- rigor-rails-routes

config/routes.rbが与えられると、プラグインはRailsが生成するであろうすべてのヘルパーを認識し、呼び出し箇所でのタイプミスやアリティの不一致を指摘します。

file:line:col: info: `users_path` → GET /users
file:line:col: info: `admin_widgets_path` → GET /admin/widgets
file:line:col: error: no route helper `widgts_path` (did you mean `users_path`?)
file:line:col: error: `user_path` expects 1 argument(s), got 3

_path形と_url形の両方が認識されます。

パーサは、実際のアプリが使うルーティングDSLをカバーします(Mastodon/Redmine/GitLab FOSSに対するv0.1.11 / v0.1.12のOSS調査で拡張されました)。

  • Rails.application.routes.draw do … end、およびdraw :name / draw_all :nameによる部分ルートファイル。
  • resources / resourceonly: / except:つき)、ネストされたリソース、member do … end / collection do … end
  • namespace :admin do … endscope — 位置引数形式とキーワードscope(path:, as:, module:)の両方。as:プレフィックスと動的パスセグメントはヘルパーのアリティに数え入れられます。
  • root、および明示的なget/post/patch/put/deleteルート(as:で名前付け、匿名の静的ルートを含む)。
  • devise_formountuse_doorkeeperwith_optionsdirectconcern :name do … end(定義は記録されますが、wrong-arityの偽陽性を避けるため本体はスキップされます)。
plugins:
- gem: rigor-rails-routes
config:
routes_file: "config/routes.rb" # default
helper_paths: ["app"] # default; dirs scanned for
# project-defined *_path / *_url methods

helper_pathsにより、自分で定義したURLビルダー(例えばapp/controllersapp/lib配下のprivateなdef callback_url)もプラグインに登録できるため、それらへの呼び出しが不明なヘルパーとして指摘されなくなります。

解析済みのヘルパーテーブルは:helper_tableクロスプラグインファクト(fact、ADR-9)として公開され、rigor-actionpackがそれを消費してコントローラー内のヘルパー呼び出しを検証します。

  • 静的に展開できないルート定義。パーサがメタプログラミングを展開できないことで生成されるヘルパー(ランタイムデータに対するループで構築されるルート、パーサがモデル化していないエンジンが注入するヘルパー)は登録されない場合があり、偽のunknown-helperが表面化することがあります。それらはベースライン(baseline)に記録するか、その行に# rigor:disableを付けてください。
  • プロジェクト固有の活用変化config/initializers/inflections.rbで宣言されたもの)はまだ取り込まれていません(ADR-39スライス3)。標準のActiveSupportの活用変化はカバーされています。

Prismルートパーサ、キャッシュされた:helper_tableプロデューサー、デモ、そしてこのプラグインが利用する契約のサーフェスについては、プラグインのREADMEを参照してください。プラグインの書き方については、examples/rigor-plugin-authorスキルを参照してください。

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.