Rails offers the fresh_when method to automatically compute an ETag from the given record, array of records or scope of records:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
fresh_when @user
end
def index
@users = User.all.to_a
fresh_when @users
end
end
When your view also displays other records (typically associations), those other records should be included in the ETag. You can do so by passing an array of ETaggable objects to fresh_when.
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
# The show template also renders the user's posts.
fresh_when [@user, *@user.posts]
end
def index
@users = User.all.preload(:group).to_a
# The index template also renders the user's group.
fresh_when [*@users, *@users.map(&:group)]
end
end
When you find yourself mixing in the same ETag inputs in all actions, you may also use a controller-wide etag { ... } block:
class UsersController < ApplicationController
etag { current_user } # Mix the current user into the ETag of all actions
def show
...
end
def index
...
end
end
Read more
Posted by Henning Koch to makandra dev (2023-04-14 13:29)