Кэширование действий 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