Блог Ruby-разработчика

Кэшируем статику с `http_cache_forever` в Rails 5

| Comments

Продолжаем знакомиться с нововведениями в Rails 5. Часто в проектах бывают статические странички, которые редко меняются, и нам не хотелось бы рендерить их каждый раз заново. В Rails 5 есть метод http_cache_forever который используется в контроллере, и позволяет закэшировать страницу.

Рассмотрим пример:

1
2
3
4
5
6
7
8
# app/controllers/pages_controller.rb
class PagesController < ApplicationController
  def about
  end
end

# app/views/pages/about.html.erb
<h1>О нас</h1>

Есть контроллер Pages, в нем action about, который рендерит страницу ‘О нас’ нашего сайта. Посмотрим на логи нашего приложения:

1
2
3
Processing by PagesController#about as HTML
  Rendered pages/about.html.erb within layouts/application (1.3ms)
Completed 200 OK in 224ms (Views: 212.4ms | ActiveRecord: 0.0ms)

Видно что рендеринг страницы занимает 212.4ms. Это довольно много, видимо на странице много контента. Попробуем использовать http_cache_forever.

1
2
3
4
5
6
# app/controllers/pages_controller.rb
class PagesController < ApplicationController
  def about
    http_cache_forever(public: true, version: 'v1') {}
  end
end

Этот метод в качестве первого аргумента принимает список опций, а вторым блок, который может быть записан также с помощью do end Используя этот метод, мы устанавливаем заголовки ответа, которые указывают браузеру, что ответ не изменился и можно использовать закэшированную версию страницы. И в логах теперь будет следующее:

1
2
3
4
5
6
7
8
9
10
# Первый запрос

Processing by PagesController#about as HTML
  Rendered pages/about.html.erb within layouts/application (1.3ms)
Completed 200 OK in 224ms (Views: 212.4ms | ActiveRecord: 0.0ms)

# Последующий запрос

Processing by PagesController#about as HTML
Completed 304 Not Modified in 2ms (ActiveRecord: 0.0ms)

Происходит первый запрос, во втором браузеру отправляется заголовок ответа “304 Not Modified”, и мы видим кэшированную страницу

Подробнее о http_cache_forever

Рассмотрим опции которые передаются в этот метод. Если мы не укажем public: true, то кэширование будет работать только для браузера, в противном случае, кэширование включится также и для проксированных запросов.

Используйте опцию version, когда вы изменили страничку, и хотите инвалидировать кэш. Указав версию отличную от предыдущей, вы заставите браузер обновить пересоздать кэш страницы. Например version: 'v2' Посмотреть на реализацию, можно заглянув на гитхаб, в этот коммит.

Comments