модуль ActionController::ConditionalGet
Публичные методы экземпляров
# 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 для совместимости с клиентом.
# 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, чтобы браузер и промежуточные кэши (например, кэширующие прокси-серверы) не кэшировали ответ.
# 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' }
# 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.