Spec-Zone.ru › Ruby on Rails 5.2

модуль ActionController::ConditionalGet

Включенные модули:
ActionController::Head

Общедоступные методы экземпляров

expires_in(seconds, options = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 234
def expires_in(seconds, options = {})
  response.cache_control.merge!(
    max_age: seconds,
    public: options.delete(:public),
    must_revalidate: options.delete(:must_revalidate)
  )
  options.delete(:private)

  response.cache_control[:extras] = options.map { |k, v| "#{k}=#{v}" }
  response.date = Time.now unless response.date?
end

Устанавливает заголовок HTTP 1.1 Cache-Control. По умолчанию устанавливает инструкцию private, чтобы промежуточные кэши не кэшировали ответ.

expires_in 20.minutes
expires_in 3.hours, public: true
expires_in 3.hours, public: true, must_revalidate: true

Этот метод перезапишет существующий заголовок Cache-Control. См. www.w3.org/Protocols/rfc2616/rfc2616-sec14.html для других возможностей.

Метод также гарантирует наличие заголовка HTTP Date для совместимости с клиентом.

expires_now() Показать исходный код
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 249
def expires_now
  response.cache_control.replace(no_cache: true)
end

Устанавливает заголовок HTTP 1.1 Cache-Control в значение no-cache. Это означает, что ресурс будет помечен как устаревший, поэтому клиенты всегда должны проверять его. Промежуточные кэши/браузеры могут по-прежнему хранить актив

fresh_when(object = nil, etag: nil, weak_etag: nil, strong_etag: nil, last_modified: nil, public: false, template: nil) Показать исходный код
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 105
def fresh_when(object = nil, etag: nil, weak_etag: nil, strong_etag: nil, last_modified: nil, public: false, template: nil)
  weak_etag ||= etag || object unless strong_etag
  last_modified ||= object.try(:updated_at) || object.try(:maximum, :updated_at)

  if strong_etag
    response.strong_etag = combine_etags strong_etag,
      last_modified: last_modified, public: public, template: template
  elsif weak_etag || template
    response.weak_etag = combine_etags weak_etag,
      last_modified: last_modified, public: public, template: template
  end

  response.last_modified = last_modified if last_modified
  response.cache_control[:public] = true if public

  head :not_modified if request.fresh?(response)
end

Устанавливает etag, last_modified, или оба в ответе и отображает ответ 304 Not Modified, если запрос уже свежий.

Параметры:

  • :etag Устанавливает «слабый» валидатор ETag в ответе. См. опцию :weak_etag.

  • :weak_etag Устанавливает «слабый» валидатор ETag в ответе. Запросы, которые устанавливают заголовок If-None-Match, могут вернуть ответ 304 Not Modified, если он точно совпадает с ETag. Слабый ETag указывает на семантическое соответствие, а не точное равенство байтов, поэтому они подходят для кэширования HTML-страниц в кэшах браузеров. Их нельзя использовать для ответов, которые должны быть идентичны по байтам, например, для обработки запросов Range в файле PDF.

  • :strong_etag Устанавливает «сильный» валидатор ETag в ответе. Запросы, которые устанавливают заголовок If-None-Match, могут вернуть ответ 304 Not Modified, если он точно совпадает с ETag. Сильный ETag подразумевает точное равенство: ответ должен совпадать по байтам. Это необходимо для обработки запросов Range в больших видео- или PDF-файлах, например, или для совместимости с некоторыми CDN, которые не поддерживают слабые ETag.

  • :last_modified Устанавливает «слабый» валидатор последнего обновления в ответе. Последующие запросы, которые устанавливают заголовок If-Modified-Since, могут вернуть ответ 304 Not Modified, если last_modified <= If-Modified-Since.

  • :public По умолчанию заголовок Cache-Control является частным, установите это в true, если вы хотите, чтобы ваше приложение можно было кэшировать другими устройствами (прокси-кэшами).

  • :template По умолчанию в ETag включен дайджест шаблона для текущего контроллера/действия. Если действие рендерит другой шаблон, вы можете включить его дайджест вместо него. Если действие вообще не рендерит шаблон, вы можете передать template: false, чтобы пропустить попытку проверки дайджеста шаблона.

Пример:

def show
  @article = Article.find(params[:id])
  fresh_when(etag: @article, last_modified: @article.updated_at, public: true)
end

Это отобразит шаблон show, если запрос не отправляет совпадающий заголовок ETag или If-Modified-Since, и просто ответ 304 Not Modified, если есть совпадение.

Также можно просто передать запись. В этом случае last_modified будет установлено вызовом updated_at, а etag - передачей самого объекта.

def show
  @article = Article.find(params[:id])
  fresh_when(@article)
end

Также можно передать объект, который отвечает на maximum, такой как коллекцию активных записей. В этом случае last_modified будет установлено вызовом maximum(:updated_at) на коллекции (отметка времени последней обновленной записи), а etag - передачей самого объекта.

def index
  @articles = Article.all
  fresh_when(@articles)
end

При передаче записи или коллекции вы по-прежнему можете установить заголовок public:

def show
  @article = Article.find(params[:id])
  fresh_when(@article, public: true)
end

При рендеринге другого шаблона, чем по умолчанию для контроллера/действия, вы можете указать дайджест, который нужно включить в ETag:

before_action { fresh_when @article, template: 'widgets/show' }
http_cache_forever(public: false) { || ... } Показать исходный код
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 261
def http_cache_forever(public: false)
  expires_in 100.years, public: public

  yield if stale?(etag: request.fullpath,
                  last_modified: Time.new(2011, 1, 1).utc,
                  public: public)
end

Кэшировать или выполнить блок. Кэш не должен истекать.

Вы можете использовать этот метод, когда у вас есть HTTP-ответ, который никогда не меняется, и браузер и прокси должны кэшировать его неограниченно.

  • public: По умолчанию HTTP-ответы являются частными, кэшируются только в браузере пользователя. Чтобы разрешить прокси кэшировать ответ, установите true, чтобы они могли предоставлять кэшированный ответ всем пользователям.

stale?(object = nil, **freshness_kwargs) Показать исходный код
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 218
def stale?(object = nil, **freshness_kwargs)
  fresh_when(object, **freshness_kwargs)
  !request.fresh?(response)
end

Устанавливает etag и/или last_modified в ответе и проверяет его по отношению к запросу клиента. Если запрос не соответствует предоставленным параметрам, запрос считается устаревшим и должен быть сгенерирован заново. В противном случае, он свежий и нам не нужно ничего генерировать, и отправляется ответ 304 Not Modified.

Параметры:

  • :etag Устанавливает «слабый» валидатор ETag в ответе. См. опцию :weak_etag.

  • :weak_etag Устанавливает «слабый» валидатор ETag в ответе. Запросы, которые устанавливают заголовок If-None-Match, могут вернуть ответ 304 Not Modified, если он точно совпадает с ETag. Слабый ETag указывает на семантическое соответствие, а не точное равенство байтов, поэтому они подходят для кэширования HTML-страниц в кэшах браузеров. Их нельзя использовать для ответов, которые должны быть идентичны по байтам, например, для обработки запросов Range в файле PDF.

  • :strong_etag Устанавливает «сильный» валидатор ETag в ответе. Запросы, которые устанавливают заголовок If-None-Match, могут вернуть ответ 304 Not Modified, если он точно совпадает с ETag. Сильный ETag подразумевает точное равенство: ответ должен совпадать по байтам. Это необходимо для обработки запросов Range в больших видео- или PDF-файлах, например, или для совместимости с некоторыми CDN, которые не поддерживают слабые ETag.

  • :last_modified Устанавливает «слабый» валидатор последнего обновления в ответе. Последующие запросы, которые устанавливают заголовок If-Modified-Since, могут вернуть ответ 304 Not Modified, если last_modified <= If-Modified-Since.

  • :public По умолчанию заголовок Cache-Control является частным, установите это в true, если вы хотите, чтобы ваше приложение можно было кэшировать другими устройствами (прокси-кэшами).

  • :template По умолчанию в ETag включен дайджест шаблона для текущего контроллера/действия. Если действие рендерит другой шаблон, вы можете включить его дайджест вместо него. Если действие вообще не рендерит шаблон, вы можете передать template: false чтобы пропустить попытку проверки дайджеста шаблона.

Пример:

def show
  @article = Article.find(params[:id])

  if stale?(etag: @article, last_modified: @article.updated_at)
    @statistics = @article.really_expensive_call
    respond_to do |format|
      # all the supported formats
    end
  end
end

Также можно просто передать запись. В этом случае last_modified будет установлено вызовом updated_at, а etag - передачей самого объекта.

def show
  @article = Article.find(params[:id])

  if stale?(@article)
    @statistics = @article.really_expensive_call
    respond_to do |format|
      # all the supported formats
    end
  end
end

Также можно передать объект, который отвечает на maximum, такой как коллекцию активных записей. В этом случае last_modified будет установлено вызовом +maximum(:updated_at)+ на коллекции (отметка времени последней обновленной записи), а etag - передачей самого объекта.

def index
  @articles = Article.all

  if stale?(@articles)
    @statistics = @articles.really_expensive_call
    respond_to do |format|
      # all the supported formats
    end
  end
end

При передаче записи или коллекции вы по-прежнему можете установить заголовок public:

def show
  @article = Article.find(params[:id])

  if stale?(@article, public: true)
    @statistics = @article.really_expensive_call
    respond_to do |format|
      # all the supported formats
    end
  end
end

При рендеринге другого шаблона, чем по умолчанию для контроллера/действия, вы можете указать дайджест, который нужно включить в ETag:

def show
  super if stale? @article, template: 'widgets/show'
end

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API