Можно ли отключить кеш-стойку для каждого запроса в Rails 3.2? - PullRequest
5 голосов
/ 29 марта 2012

Я пытался заставить потоковую работу работать в Rails 3.2 на Heroku (см. Мой пост SO здесь: Потоковая передача Rails 3.2 ).

Я пришел к выводу, что кеш-стойкавызывает проблему.Отключение с помощью config.middleware.delete(Rack::Cache) в production.rb, кажется, исправляет это.Это, очевидно, отключает его для всего моего приложения.

Я хочу отключить его только для одного потокового запроса (который находится на стороне администратора и будет использоваться нечасто).Это возможно?Было бы обидно потерять кеширование ради одной маленькой (но обязательной) функции администратора.

Большое спасибо !!!

Редактировать: я попытался установить заголовки вне кэшировать рассматриваемое действие, но Rack :: Cache все еще вызывает сбой потоковой передачи.Полное отключение - единственное решение, которое я нашел до сих пор.

Ответы [ 2 ]

2 голосов
/ 27 апреля 2012

В итоге мне не нужно было отключать Rack-cache.Просто нужно добавить это self.response.headers['Last-Modified'] = Time.now.ctime.to_s в мой ответ.

1 голос
/ 29 марта 2012

Хотя вы не можете отключить его, вам может не понадобиться;вам может просто понадобиться обойти механизм кэширования.

Для источника здесь и здесь , если установлены заголовок Cache-Control: no-cache или заголовки Pragma: no-cache,Rack :: Cache не будет пытаться получить запрос из кеша.Это не отключает его, но позволяет убедиться, что у вас нет запроса, который не должен кэшироваться, и в конечном итоге возвращает ответ кэширования.

Кроме того, вы можете убедиться, что Rack :: Cacheникогда не кэширует ответ для данного действия с чем-то вроде:

response.headers['Cache-Control'] = 'private,max-age=0,must-revalidate,no-store'

в вашем действии контроллера.Это гарантирует, что Rack :: Cache (и любые другие прокси-серверы верхнего уровня) не кэшируют ответ, что приводит к всегда свежему попаданию в ваш бэкэнд.

Если это не удастся, то, скорее всего, у вас возникли проблемыиз-за метода forward в context.rb.Кажется, нет способа обойти это, поэтому вы, вероятно, захотите исправить Rack :: Cache, чтобы просто вызывать #call, если установлен определенный заголовок.

...