Rails 7.1以降で発生するプレビュー読み込みエラーを `require` への置き換えで修正
Rails 7.1でZeitwerkへの一本化に伴い削除された require_dependency を require に置き換え、モダンなRailsアプリでのプレビュー読み込みエラーを解消します。
背景
Rails 7.1は Zeitwerk のみをサポートするオートローディング体制に移行し、その過程で require_dependency を削除しました。ViewComponentのプレビュー読み込み処理がこの削除済みメソッドを使用し続けていたため、Rails 7.1以降の環境でプレビューを利用するアプリケーションでエラーが発生する状態になっていました。
技術的な変更
lib/view_component/preview.rb の __vc_load_previews メソッド内で、プレビューファイルの読み込みに使用するメソッドを変更しました。
変更前:
Dir["#{preview_path}/**/*preview.rb"].sort.each { |file| require_dependency file }
変更後:
Dir["#{preview_path}/**/*preview.rb"].sort.each { |file| require file }
変更は1行のみで、require_dependency を標準の require に置き換えるだけです。__vc_load_previews は preview_paths に登録されたディレクトリ以下の *preview.rb ファイルを検索し、一括で読み込む処理を担っており、この変更によってRails 7.1以降の環境でも正常に動作します。
設計判断
require_dependency を単純に require へ置き換える 最小限のアプローチが採用されています。
require_dependency はZeitwerkベースの環境では不要であり、Zeitwerkが管理しないファイルを手動で読み込む場合は標準の require が適切な代替手段です。プレビューファイルはZeitwerkのオートロード対象パス外に配置されるケースが一般的であるため、明示的な require による読み込みは理にかなっています。
より複雑な対応策(Zeitwerkへのパス登録など)も考えられますが、プレビューファイルのロードという限定的なユースケースに対して、シンプルな置き換えが選ばれています。
まとめ
この修正は1行の変更でありながら、Rails 7.1以降の環境でViewComponentのプレビュー機能が使えない問題を解消します。削除済みAPIへの依存を取り除き、Zeitwerk時代のRailsとの互換性を回復した最小コストな修正といえます。