rigor-activestorage
ActiveRecordのモデルファイルを走査してhas_one_attached/has_many_attachedマクロを探し、それらが生成するアタッチメントアクセサを型付けします。これにより、アタッチメントをナビゲートする際に、型のないエンベロープに落ちる代わりにActiveStorage自身のRBSサーフェス(surface)を通じて解決されます。ソースのみを読み、Railsのランタイム依存はありません。
このプラグインはrigortypeにバンドルされて提供されます。plugins:の下で有効化します:
plugins: - rigor-activestorage何を推論するか
Section titled “何を推論するか”class User < ApplicationRecord has_one_attached :avatar has_many_attached :photosend
user = User.find(1)user.avatar # Nominal[ActiveStorage::Attached::One]user.avatar.attached? # resolves through ActiveStorage's RBSuser.photos # Nominal[ActiveStorage::Attached::Many]| マクロ | アクセサ | 提供される型 |
|---|---|---|
has_one_attached :avatar | user.avatar | Nominal[ActiveStorage::Attached::One] |
has_many_attached :photos | user.photos | Nominal[ActiveStorage::Attached::Many] |
セッター(user.avatar = …)や引数付きのアタッチメント名呼び出しについては関与を控えます ── それらはActiveStorage自身のRBSがカバーします。
| ルール | 重大度 | いつ |
|---|---|---|
plugin.activestorage.attachment-call | info | 認識されたmodel.attachment_name呼び出しが表面化したとき。モデル → アタッチメントのマッピングを確認する |
plugin.activestorage.load-error | warning | 発見に失敗したとき(例: IoBoundaryの信頼ポリシーの下でモデルディレクトリにアクセスできない) |
このスライスには:error診断はありません ── 価値は戻り値型の提供にあります。「未知のアタッチメント名」ルールは将来のスライスです。
plugins: - gem: rigor-activestorage config: model_search_paths: ["app/models"] # defaultrigor-activerecordの有無について
Section titled “rigor-activerecordの有無について”このプラグインはモデルファイルを独立して発見するため、単体で動作します。rigor-activerecordも有効な場合、両者は共存します(それぞれが呼び出しごとの戻り値型を提供し、提供のマージャーが調整します)。:model_index依存はoptionalとして宣言されており、アタッチメントの認識を発見済みのARクラスに限定する将来のスライスのために予約されています。
プラグインの内部
Section titled “プラグインの内部”発見パス、AttachmentIndex、そしてこのプラグインが行使する契約(contract)サーフェスは、プラグインのREADMEにあります。プラグインを書くには、examples/とrigor-plugin-authorスキルを参照してください。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.