Method: ActionController::ConditionalGet#expires_in

Defined in:
actionpack/lib/action_controller/metal/conditional_get.rb

#expires_in(seconds, options = {}) ⇒ Object

Sets the ‘Cache-Control` header, overwriting existing directives. This method will also ensure an HTTP `Date` header for client compatibility.

Defaults to issuing the ‘private` directive, so that intermediate caches must not cache the response.

#### Options

‘:public` : If true, replaces the default `private` directive with the `public`

directive.

‘:must_revalidate` : If true, adds the `must-revalidate` directive.

‘:stale_while_revalidate` : Sets the value of the `stale-while-revalidate` directive.

‘:stale_if_error` : Sets the value of the `stale-if-error` directive.

‘:immutable` : If true, adds the `immutable` directive.

Any additional key-value pairs are concatenated as directives. For a list of supported ‘Cache-Control` directives, see the [article on MDN](developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control).

#### Examples

expires_in 10.minutes
# => Cache-Control: max-age=600, private

expires_in 10.minutes, public: true
# => Cache-Control: max-age=600, public

expires_in 10.minutes, public: true, must_revalidate: true
# => Cache-Control: max-age=600, public, must-revalidate

expires_in 1.hour, stale_while_revalidate: 60.seconds
# => Cache-Control: max-age=3600, private, stale-while-revalidate=60

expires_in 1.hour, stale_if_error: 5.minutes
# => Cache-Control: max-age=3600, private, stale-if-error=300

expires_in 1.hour, public: true, "s-maxage": 3.hours, "no-transform": true
# => Cache-Control: max-age=3600, public, s-maxage=10800, no-transform=true


290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
# File 'actionpack/lib/action_controller/metal/conditional_get.rb', line 290

def expires_in(seconds, options = {})
  response.cache_control.delete(:no_store)
  response.cache_control.merge!(
    max_age: seconds,
    public: options.delete(:public),
    must_revalidate: options.delete(:must_revalidate),
    stale_while_revalidate: options.delete(:stale_while_revalidate),
    stale_if_error: options.delete(:stale_if_error),
    immutable: options.delete(:immutable),
  )
  options.delete(:private)

  response.cache_control[:extras] = options.map { |k, v| "#{k}=#{v}" }
  response.date = Time.now unless response.date?
end