123456789_123456789_123456789_123456789_123456789_

Module: ActionController::EtagWithTemplateDigest

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Defined in: actionpack/lib/action_controller/metal/etag_with_template_digest.rb

Overview

When our views change, they should bubble up into HTTP cache freshness and bust browser caches. So the template digest for the current action is automatically included in the ETag.

Enabled by default for apps that use Action View. Disable by setting

config.action_controller.etag_with_template_digest = false

Override the template to digest by passing :template to fresh_when and stale? calls. For example:

# We're going to render widgets/show, not posts/show
fresh_when @post, template: 'widgets/show'

# We're not going to render a template, so omit it from the ETag.
fresh_when @post, template: false

ConditionalGet - Attributes & Methods

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Method Summary

ConditionalGet - Included

#expires_in

Sets the Cache-Control header, overwriting existing directives.

#expires_now

Sets an HTTP 1.1 Cache-Control header of no-cache.

#fresh_when

Sets the etag, last_modified, or both on the response, and renders a ‘304 Not Modified` response if the request is already fresh.

#http_cache_forever

Cache or yield the block.

#no_store

Sets an HTTP 1.1 Cache-Control header of no-store.

#stale?

Sets the etag and/or last_modified on the response and checks them against the request.

#combine_etags

Head - Included

#head

Returns a response that has no content (merely headers).

#include_content?

DSL Calls

included

[ GitHub ]


30
31
32
33
34
35
36
# File 'actionpack/lib/action_controller/metal/etag_with_template_digest.rb', line 30

included do
  class_attribute :etag_with_template_digest, default: true

  etag do |options|
    determine_template_etag(options) if etag_with_template_digest
  end
end

Class Attribute Details

.etaggers (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/conditional_get.rb', line 15

class_attribute :etaggers, default: []

.etaggers?Boolean (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/conditional_get.rb', line 15

class_attribute :etaggers, default: []

Instance Attribute Details

#etaggers (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/conditional_get.rb', line 15

class_attribute :etaggers, default: []

#etaggers?Boolean (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/conditional_get.rb', line 15

class_attribute :etaggers, default: []

Instance Method Details

#determine_template_etag(options) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/etag_with_template_digest.rb', line 39

def determine_template_etag(options)
  if template = pick_template_for_etag(options)
    lookup_and_digest_template(template)
  end
end

#lookup_and_digest_template(template) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/etag_with_template_digest.rb', line 55

def lookup_and_digest_template(template)
  ActionView::Digestor.digest name: template, format: nil, finder: lookup_context
end

#pick_template_for_etag(options) (private)

Pick the template digest to include in the ETag. If the :template option is present, use the named template. If :template is nil or absent, use the default controller/action template. If :template is false, omit the template digest from the ETag.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/etag_with_template_digest.rb', line 49

def pick_template_for_etag(options)
  unless options[:template] == false
    options[:template] || lookup_context.find_all(action_name, _prefixes).first&.virtual_path
  end
end