Rails6(開発環境)において、Viewファイル保存後のリロードで、Unit側のViewファイルの呼び出しが失敗する
eudoxa opened this issue · 2 comments
発生環境
Rails6 + development + zeitwerk及びclassicのview拡張
再現方法
scope(:view) do
function(:hello) do
render '/hello'
end
end
上記をviewファイルから呼び出した状態で、viewファイル「のみ」を保存しリロードすると、下記のエラーが発生する。
[Chanko] ActionView::Template::Error - undefined method `_app_units_hello_world_views__hello_html_erb__3197552978688360732_19600' for #<ActionView::Base:0x00000000009ad8>
原因(調査中)
Rails6ではViewファイルを保存するたびにActionView::Baseを作り直すようで、Unitで事後に定義したviewファイルの追加設定が反映されない。
Rails6
1. Viewクラスのインスタンス(viewでのself.__id__)
- リロード => 不変
- Viewファイル書き換え => 変更
- Modelファイル書き換え => 変更
2. Model/Unit
- リロード => 不変
- Viewファイル書き換え => 不変
- Modelファイル書き換え => 変更
Rails5
1. Viewクラスのインスタンス(viewでのself.__id__)
- リロード => 不変
- Viewファイル書き換え => 不変
- Modelファイル書き換え => 変更
3. Model/Unit
- リロード => 不変
- Viewファイル書き換え => 不変
- Modelファイル書き換え => 変更
発生している問題を整理
通常、erb等のviewを更新保存すると、Templateインスタンス及び、view.compiled_method_containerが作り直されます。しかしChankoのUnitで利用しているviewではTemplateインスタンスが作り直されていません。
なぜTemplateインスタンスの作り直しが問題になるかですが、view.compiled_method_containerの管理はviewが直接行わず、Templateインスタンスのcompiledフラグで管理しています。そのためTemplateインスタンスが作り直されないと、compiledフラグがtrueのままにもかかわらず、view側のcompileが行われていない状態になります。
https://github.com/rails/rails/blob/6-1-stable/actionview/lib/action_view/template.rb#L238-L258
Rails6対応のPRで書いた下記とも関係している可能性があります。
#64 (review)
(追記)
まだCode readingの途中ですが、おそらくはリロード時にview_pathsにunitの設定が無いため、下記のclear処理で適切にキャッシュが削除されないようです。
https://github.com/rails/rails/blob/main/actionview/lib/action_view/cache_expiry.rb
https://github.com/rails/rails/blob/main/actionview/lib/action_view/lookup_context.rb#L73-L80
もう少し調べつつ、対応方法を検討します。