fresh_when(record_or_options, additional_options = {}) public

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


  • :etag.

  • :last_modified.

  • :public By default the Cache-Control header is private, set this to true if you want your application to be cachable by other devices (proxy caches).

  • :template By default, the template digest for the current controller/action is included in ETags. If the action renders a different template, you can include its digest instead. If the action doesn’t render a template at all, you can pass template: false to skip any attempt to check for a template digest.


def show
  @article = Article.find(params[:id])
  fresh_when(etag: @article, last_modified: @article.created_at, public: true)

This will render the show template if the request isn’t sending a matching ETag or If-Modified-Since header and just a 304 Not Modified response if there’s a match.

You can also just pass a record where last_modified will be set by calling updated_at and the etag by passing the object itself.

def show
  @article = Article.find(params[:id])

When passing a record, you can still set whether the public header:

def show
  @article = Article.find(params[:id])
  fresh_when(@article, public: true)

When rendering a different template than the default controller/action style, you can indicate which digest to include in the ETag:

before_action { fresh_when @article, template: 'widgets/show' }
Show source
Register or log in to add new notes.