Кеширование / Etag для статических действий в Rails 4

Поскольку Rails 4 удалил кеширование страниц и кеширование действий, мне интересно, как Rails 4 может кэшировать действие, которое не имеет переменных и имеет только html в представлении? Должен ли я фрагментировать кэш статического HTML в представлении? Как мне установить etag / fresh_when, когда нет модели, с которой он истекает? Я изо всех сил пытаюсь найти пример или соглашение о кешировании того, что должно быть самой простой страницей для кеширования.

Одно замечание заключается в том, что, хотя представление полностью статично, на странице все еще есть динамическая панель навигации в зависимости от того, вошел ли пользователь в систему или нет. Как бы вы справились со статической страницей, подобной этой, не прибегая к кэшированию действий, поскольку она была удалена и было установлено соглашение не использовать версию gem?

Пример:

class HomesController < ApplicationController    
  def index
  end
end

дома / index.html.erb

<div>A bunch of normal html tags with no erb</div>

Изменить: на основе ответа @severin и моих собственных исследований, вот что я придумал до сих пор.

class HomesController < ApplicationController    
  def index
    fresh_when(["some-identifier", current_user, flash])
  end
end

Кроме того, я использую https://github.com/n8/bust_rails_etags, чтобы сбросить все etags после развертывание, потому что представление могло измениться между развертываниями. Я думаю, что это довольно хорошо покрывает etag, хотя мне все еще любопытно, будет ли свежий, когда будет автоматически включать какой-либо идентификатор о представлении, и нужен ли "some-idnetifier"? Будет ли проблема, что иногда current_user и flash будут равны нулю?

Теперь о втором пункте фрагментного кеширования статического содержимого. Я предполагаю, что если бы я сделал:

cache "v1" do
  all my html
end

Мне нужно было всегда помнить об изменении идентификатора кеша при изменении страницы, иначе мое приложение будет обслуживать устаревший контент. Есть ли способ автоматизировать это, или это уже обрабатывается рельсами? Было бы неплохо просто кэшировать последний раз, когда представление было обновлено, или что-то умное, чтобы мне не приходилось отслеживать, когда мой статический контент изменяется.


person John    schedule 23.05.2013    source источник
comment
Я ответил на вторую часть вашего вопроса в своем ответе. Если что-то неясно или у вас есть дополнительные вопросы, не стесняйтесь их задавать :)   -  person severin    schedule 27.05.2013


Ответы (1)


Вы можете установить etag / last modified at data без модели, проверьте документацию: http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when

Итак, вы можете сделать что-то вроде:

def index
  fresh_when(:etag => 'some_made_up_etag', :last_modified => a_long_time.ago, :public => true)
  render
end

Примечание: вам не нужно указывать etag И последнее изменение на временной отметке, вы можете просто указать etag или только последнее изменение на временной отметке.

В дополнение к этому, я бы также фрагментировал кеширование всего содержимого представления.

Или вы можете просто продолжить использование action- / page_caching, используя официальный плагин / гем: https://github.com/rails/actionpack-page_caching


Некоторые дополнения по второй части вашего вопроса:

Rails добавляет содержимое переменной окружения RAILS_CACHE_ID ко всем своим ключам кеширования (etag и ключ кеширования фрагментов в вашем примере). Гем bust_rails_etags добавляет еще одну переменную среды, которая влияет только на etags ... Итак, в вашем случае вы можете просто удалить гем bust_rails_etags и обновить переменную среды RAILS_CACHE_ID во всех ваших развертываниях.

Вы даже можете автоматизировать обновление переменной среды RAILS_CACHE_ID, добавив что-то вроде этого в config / environment.rb:

code_revision = # ... some piece of code that gets the current revision.
                # I'm using git and I use the following (crude) piece of
                # to get the current revision:
                # code_revision = `git log --pretty=format:%h -n1`.strip
ENV['RAILS_CACHE_ID'] = code_revision

Таким образом, текущая версия кода всегда добавляется ко всем ключам кеша.

person severin    schedule 26.05.2013
comment
Да, это было похоже на то, о чем я думал. Я обновил свой вопрос, добавив еще несколько вопросов о статическом кешировании. - person John; 26.05.2013
comment
Спасибо, ваш ответ был тем, что я искал. Я использую тег heroku deploy вместо git, так как heroku выдавал ошибку с командой git, которая, кажется, отлично работает! - person John; 28.05.2013
comment
rails 4 etag хорошо освещен скринкастами rails 4 zombie owtlaws - person equivalent8; 21.08.2013