Хорошо, поэтому я смотрел на это большую часть ночи (удивительно!) И отлаживал его до строки в vendor / rails / actionpack / lib / action_controller / caching / actions.rb .. .on строка 127 запускает метод следующим образом:
def cache_layout?
@options[:layout] == false
end
Моя линия:
caches_action :index, :expires_in => 6.hours, :cache_path => Proc.new {|controller| controller.send(:generate_cache_path) }, :layout => false
Для меня это означает, что мы не хотим кэшировать макет, только действие. Но проверяя @options [: layout] == false, затем, когда layout имеет значение false, сам метод возвращает true, говоря, что вы должны кэшировать макет.
Это похоже на ошибку для меня. На данный момент я только что изменил мою строку макета на: layout => true, и это, кажется, работает, но это явно нелогично.
Для справки, cache_layout? метод вызывается здесь:
def after(controller)
return if controller.rendered_action_cache || !caching_allowed(controller)
action_content = cache_layout? ? content_for_layout(controller) : controller.response.body
controller.write_fragment(controller.action_cache_path.path, action_content, @options[:store_options])
end
Это также вынуждает: layout => true в вызов рендеринга для любого действия. Вы будете запускаться из контроллера, что, честно говоря, не , что я хочу, чтобы произошло, если мне нужно установить его в: layout => true, чтобы получить cache_layout? вернуть ложь.
Как раз то, что я придумал.