Spec-Zone.ru › Ruby on Rails 4.1

модуль ActionController::ConditionalGet

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

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

expires_in(seconds, options = {}) Показать исходный код

Устанавливает заголовок 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 для совместимости с клиентом.

# File actionpack/lib/action_controller/metal/conditional_get.rb, line 152
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
expires_now() Показать исходный код

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

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

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

Параметры:

  • :etag.

  • :last_modified.

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

Пример:

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
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 69
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)
  else
    record  = record_or_options
    options = { etag: record, last_modified: record.try(:updated_at) }.merge!(additional_options)
  end

  response.etag          = combine_etags(options[:etag]) if options[:etag]
  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
stale?(record_or_options, additional_options = {}) Показать исходный код

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

Параметры:

  • :etag.

  • :last_modified.

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

Пример:

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
# File actionpack/lib/action_controller/metal/conditional_get.rb, line 136
def stale?(record_or_options, additional_options = {})
  fresh_when(record_or_options, additional_options)
  !request.fresh?(response)
end

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

Spec-Zone.ru

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