модуль ActionController::ConditionalGet
Публичные методы экземпляров
Устанавливает заголовок 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 Устанавливает заголовок 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
Устанавливает тег 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 Устанавливает 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.