cookpad/chanko

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

もう少し調べつつ、対応方法を検討します。

uasi commented

Closed by #70