Почему мои самоссылочные шаблоны нарушают расчет дайджеста кеша в консоли и грабли, но не на сервере?
У меня есть две части, которые относятся друг к другу. Когда я вычисляю вложенные зависимости в консоли, это нравится (при выводе некоторого кода отладки, какой шаблон загружается):
finder = ApplicationController.new.lookup_context
ActionView::Digestor.new(name: "posts/show", finder: finder).nested_dependencies
или через грабли, например так:
rake cache_digests:nested_dependencies TEMPLATE=posts/show
Я получаю короткий список начальных зависимостей, а затем это в бесконечном цикле, пока стек рубина не заполнится:
...
>>>>>>> users/foo
>>>>>>> users/bar
>>>>>>> users/baz
>>>>>>> users/bip
>>>>>>> users/foo
>>>>>>> users/bar
>>>>>>> users/baz
>>>>>>> users/bip
SystemStackError: stack level too deep
(имена шаблонов изменены)
Однако, когда я запускаю сервер приложений и запрашиваю шаблон, все работает просто отлично, бесконечных циклов нет.
Вот мои настройки во всех вышеперечисленных случаях:
config.action_controller.perform_caching = true
config.cache_store = :file_store, Rails.root.to_s + '/tmp/cache/stuff'
ActionView::Base.cache_template_loading = true
Код указывает, что он имеет рекурсивную ссылочную защиту: https://github.com/rails/rails/blob/v4.1.8/actionview/lib/action_view/digestor.rb#L35
Почему эта защита работает в серверной среде, а не в консоли или в граблях?
(также выпуск github https://github.com/rails/rails/issues/18667)
1 ответ
Rails и задача rake использует два совершенно разных метода ActionView::Digestor
,
Rails обычно вызывает
ActionView::Digestor.digest
который вызывает вcompute_and_store_digest
который имеет защиту от бесконечной петли.тем не мение
nested_dependencies
только звонкиDependencyTracker.find
_Зависимости рекурсивно без обнаружения бесконечного цикла.
Если вы проверите для использования nested_dependencies
на github вы можете видеть, что он используется только из грабли и больше нигде.
Так что ИМХО это ошибка в nested_dependencies
,