コンテンツにスキップ

rigor-activestorage

ActiveRecordのモデルファイルを走査してhas_one_attachedhas_many_attachedマクロを探し、それらが生成するアタッチメントアクセサを型付けします。これにより、アタッチメントをナビゲートする際に、型のないエンベロープに落ちる代わりにActiveStorage自身のRBSサーフェス(surface)を通じて解決されます。ソースのみを読み、Railsのランタイム依存はありません。

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

plugins:
- rigor-activestorage
class User < ApplicationRecord
has_one_attached :avatar
has_many_attached :photos
end
user = User.find(1)
user.avatar # Nominal[ActiveStorage::Attached::One]
user.avatar.attached? # resolves through ActiveStorage's RBS
user.photos # Nominal[ActiveStorage::Attached::Many]
マクロアクセサ提供される型
has_one_attached :avataruser.avatarNominal[ActiveStorage::Attached::One]
has_many_attached :photosuser.photosNominal[ActiveStorage::Attached::Many]

セッター(user.avatar = …)や引数付きのアタッチメント名呼び出しについては関与を控えます ── それらはActiveStorage自身のRBSがカバーします。

ルール重大度いつ
plugin.activestorage.attachment-callinfo認識されたmodel.attachment_name呼び出しが表面化したとき。モデル → アタッチメントのマッピングを確認する
plugin.activestorage.load-errorwarning発見に失敗したとき(例: IoBoundaryの信頼ポリシーの下でモデルディレクトリにアクセスできない)

このスライスには:error診断はありません ── 価値は戻り値型の提供にあります。「未知のアタッチメント名」ルールは将来のスライスです。

plugins:
- gem: rigor-activestorage
config:
model_search_paths: ["app/models"] # default

このプラグインはモデルファイルを独立して発見するため、単体で動作します。rigor-activerecordも有効な場合、両者は共存します(それぞれが呼び出しごとの戻り値型を提供し、提供のマージャーが調整します)。:model_index依存はoptionalとして宣言されており、アタッチメントの認識を発見済みのARクラスに限定する将来のスライスのために予約されています。

発見パス、AttachmentIndex、そしてこのプラグインが行使する契約(contract)サーフェスは、プラグインのREADMEにあります。プラグインを書くには、examples/rigor-plugin-authorスキルを参照してください。

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