Spec-Zone.ru › Ruby on Rails 4.2

модуль ActionController::ConditionalGet

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

Публичные методы экземпляров

expires_in(seconds, options = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 176
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 190
def expires_now
  response.cache_control.replace(:no_cache => true)
end

Устанавливает заголовок HTTP 1.1 Cache-Control со значением no-cache, чтобы браузер и промежуточные кэши (например, кэширующие прокси-серверы) не кэшировали ответ.

fresh_when(record_or_options, additional_options = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 80
def fresh_when(record_or_options, additional_options = {})
  if record_or_options.is_a? Hash
    options = record_or_options
    options.assert_valid_keys(:etag, :last_modified, :public, :template)
  else
    record  = record_or_options
    options = { etag: record, last_modified: record.try(:updated_at) }.merge!(additional_options)
  end

  response.etag          = combine_etags(options)   if options[:etag] || options[:template]
  response.last_modified = options[:last_modified]  if options[:last_modified]
  response.cache_control[:public] = true            if options[:public]

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

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

Параметры:

  • :etag.

  • :last_modified.

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

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

Пример:

def show
  @article = Article.find(params[:id])
  fresh_when(etag: @article, last_modified: @article.created_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

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

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

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

before_action { fresh_when @article, template: 'widgets/show' }
stale?(record_or_options, additional_options = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 160
def stale?(record_or_options, additional_options = {})
  fresh_when(record_or_options, additional_options)
  !request.fresh?(response)
end

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

Параметры:

  • :etag.

  • :last_modified.

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

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

Пример:

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

  if stale?(etag: @article, last_modified: @article.created_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

При передаче записи вы все равно можете установить, является ли заголовок 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