Кэширование действий Rails и ответы json
У меня возникают проблемы с ответом JSON на запрос json, но активировано кэширование действий.
У меня довольно простой контроллер, который отвечает как на JSON, так и на HTML, а кеширование отлично работает для ответа HTML, но я заметил, что когда я запрашиваю JSON и обычно отвечаю с JSON, но с включенным кешем действия он переносит вывод JSON в макете!
Когда я очистил кеш, это дает мне ошибку, которая не существует по умолчанию:
АргументError в ClipsController # index
Не было шаблона по умолчанию для ClipsController в...
Как вернуть JSON для кешированного действия?
UPDATE, я подозреваю, что ошибка в макете связана с тем, как я кэширую действия:
caches_action :index, :layout => false
Я не уверен, однако, почему в случае ответа JSON все равно потребуется макет, так как без кеширования проблем нет.
временно я изменил фильтр кэша, чтобы не кэшировать запросы JSON, но это не идеальная работа, что мне делать, если я хочу кэшировать JSON?
caches_action :index, :layout => false, :if => Proc.new { |c| !c.request.format.json? }
Ответы
Ответ 1
Похоже, на самом деле это может быть ошибка с кешированием действий, но, возможно, там что-то я не понимаю.
Смотрите эту строку, чтобы узнать, где это происходит. В принципе, если вы установили параметр макета в значение "ложь", ему все равно, и он все равно пытается отобразить его с помощью макета.
Ответ 2
У меня возникла аналогичная проблема (рендеринг HTML с помощью запроса ajax, макет установлен в false, но присутствует)
Здесь обходной путь: создайте пустой макет и используйте его для обслуживания запроса ajax
# app/views/layout/empty.html.erb
<%= yield %>
# controller
class FooController ...
layout Proc.new { |controller| controller.request.xhr? ? "empty" : "your normal html layout" }
caches_action ...
end