Почему мои самоссылочные шаблоны нарушают расчет дайджеста кеша в консоли и грабли, но не на сервере?

У меня есть две части, которые относятся друг к другу. Когда я вычисляю вложенные зависимости в консоли, это нравится (при выводе некоторого кода отладки, какой шаблон загружается):

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,

Другие вопросы по тегам