コンテンツにスキップ

rigor-devise

devise :strategy, …宣言からDeviseがモデルにミックスインするメソッドについて、Rigorに教えます。これにより、それらのメソッドへのファイルをまたいだ呼び出し(user.valid_password?("pw")user.send_reset_password_instructions)が、誤ったcall.undefined-methodをサーフェス(surface)させる代わりに解決され、しかも本来の戻り値の型で解決されます。ソースのみを読み取り、Deviseのランタイム依存はありません。

rigortypeにバンドルされて配布されます。plugins:の下で有効化します。

plugins:
- rigor-devise

何をするか — 診断なし、設定なし

Section titled “何をするか — 診断なし、設定なし”

rigor-deviseはマクロ展開プラグイン(ADR-16のTier B)です。診断を発行せず、設定も持ちません。次のような宣言から、

class User < ApplicationRecord
devise :database_authenticatable, :recoverable
end

名前で指定された各ストラテジーモジュールが提供するインスタンスメソッドを合成し、宣言したクラスに付与します。これにより、別ファイルでの呼び出しが型チェックを通ります。

user.valid_password?("pw") # bool
user.send_reset_password_instructions # (モジュールのRBSの戻り値)

戻り値の型は、広げられたDynamic[T]ではなく、ストラテジーモジュールが記述したRBSの戻り値origin_module:の来歴を介する)です。11個のストラテジーが認識されます ── database_authenticatablerecoverablerememberableregisterabletrackablevalidatableconfirmablelockabletimeoutableomniauthableauthenticatable ── に加えて、常に含まれるDevise::Models::Authenticatableです。ActiveSupport::Concernincluded do … endの中で宣言されたストラテジーは、そのconcernをincludeするクラスへと再ターゲットされます。

  • インスタンスメソッドのみ。モジュールごとのClassMethods(例: User.reset_password_by_token)はまだ合成されません。
  • コントローラーヘルパーは保留current_userauthenticate_user!user_signed_in?は、モデルの宣言ではなくルーティングファイルのdevise_for :usersに由来する(Tier Cの作業)ため、まだ提供されません。
  • サードパーティのストラテジーはスキャンされない。イニシャライザでDevise.add_module :fooを介して登録されたストラテジーは、バンドルされたストラテジーテーブルにとって未知です。

マクロマニフェスト(各ストラテジーをそのモジュールにマッピングするトレイトレジストリ)、concernの再ターゲットウォーク、デモ、そしてこのプラグインが行使する契約(contract)サーフェスは、プラグインのREADMEにあります。ハンドブック第9章はTier Bのマクロ基盤を全般的に扱います。プラグインの書き方については、examples/rigor-plugin-authorスキルを参照してください。

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