コンテンツにスキップ

rigor-actionmailer

Mailer.action(args).deliver_*の呼び出し箇所について、アクションの存在と引数のアリティを検証し、app/views/配下にビューテンプレートが存在しないメーラーアクションを指摘します。includeされたconcernモジュールから継承されたアクションはメーラーのアクション集合にマージされるため、includeしたEmails::*concernからアクションを導出するメーラーでも型チェックが通ります。Railsランタイムへの依存はありません。

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

plugins:
- rigor-actionmailer
demo.rb:7:1: info: `UserMailer.welcome` matches mailer action (arity 1..2)
errors_demo.rb:7:1: error: `UserMailer.welcome` expects 1..2 argument(s), got 0
errors_demo.rb:15:1: error: `UserMailer.does_not_exist` is not a defined mailer action (known actions: digest, reset_password, welcome)
app/mailers/user_mailer.rb:14:7: warning: `UserMailer#digest` has no view template under `app/views/user_mailer/`
  1. アクションの存在Mailer.unknown_action(...)unknown-action(未解決のincludeがある場合は、推測する代わりにこれを抑制します)。
  2. 引数のアリティ — 位置引数が少なすぎる/多すぎる → wrong-arity
  3. ビューテンプレートの存在 — 各アクションには少なくとも1つのapp/views/<mailer_underscore>/<action>.{html,text}.{erb,haml,slim}が必要です。存在しない場合はmissing-viewとなり、アクションのdefにアンカーされます。

認識される呼び出し形は次のとおりです。直接のアクション呼び出し(UserMailer.welcome(user))、.with(...)チェーン(UserMailer.with(user: u).welcome(user))、末尾の.deliver_now / .deliver_later(受け入れられますが、解釈はされません)。

plugins:
- gem: rigor-actionmailer
config:
mailer_search_paths: ["app/mailers"] # default
mailer_base_classes: ["ApplicationMailer", "ActionMailer::Base"] # default
views_root: "app/views" # default
  • 直接の親クラスのマッチのみBaseMailer < ApplicationMailerであるようなclass CustomerMailer < BaseMailerは、BaseMailermailer_base_classesに含まれていない限り発見されません。(includeされたconcernモジュール由来のアクションはマージされます。これは親クラスチェーンに関する話です。)
  • 構文的なアクションリスト。アクションはインスタンス側のdefから読み取られます。define_methodinitialize_始まりの名前は除外されます。
  • 標準のビューファイル名パターンのみ<action>.{html,text}.{erb,haml,slim})。カスタムエンジン/ビューパスは対象外です。
  • 真新しいビューファイルは、メーラーファイルが参照する何かが変わるまでキャッシュされたインデックスを無効化しません(リード追跡のトレードオフです)。

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

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