def expires_in(seconds, options = {})
      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),
      )
      options.delete(:private)

      response.cache_control[:extras] = options.map { |k, v| "#{k}=#{v}" }
      response.date = Time.now unless response.date?
    end
def expires_in(seconds, options = {})
      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),
      )
      options.delete(:private)

      response.cache_control[:extras] = options.map { |k, v| "#{k}=#{v}" }
      response.date = Time.now unless response.date?
    end
Sets an HTTP 1.1 Cache-Control header. Defaults to issuing a +private+
 instruction, so that intermediate caches must not cache the response.

   expires_in 20.minutes
   expires_in 3.hours, public: true
   expires_in 3.hours, public: true, must_revalidate: true

 This method will overwrite an existing Cache-Control header.
 See https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html for more possibilities.

 HTTP Cache-Control Extensions for Stale Content. See https://tools.ietf.org/html/rfc5861
 It helps to cache an asset and serve it while is being revalidated and/or returning with an error.

   expires_in 3.hours, public: true, stale_while_revalidate: 60.seconds
   expires_in 3.hours, public: true, stale_while_revalidate: 60.seconds, stale_if_error: 5.minutes

 The method will also ensure an HTTP Date header for client compatibility.