It seems there are no ways to set “Cache-Control: max-age=n” header without private/public directive. expires_in also does not provide such option.
I tried manually modify headers, but overrides private.
# frozen_string_literal: true
require "bundler/inline"
gemfile(true) do
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
gem "rails", github: "rails/rails", branch: "main"
end
require "action_controller/railtie"
class TestApp < Rails::Application
config.root = __dir__
config.hosts << "example.org"
secrets.secret_key_base = "secret_key_base"
config.logger = Logger.new($stdout)
Rails.logger = config.logger
routes.draw do
get "/" => "test#index"
end
end
class TestController < ActionController::Base
include Rails.application.routes.url_helpers
def index
response.headers["Cache-Control"] = "max-age=60"
render plain: "Home"
end
end
require "minitest/autorun"
require "rack/test"
class BugTest < Minitest::Test
include Rack::Test::Methods
def test_returns_success
get "/"
assert_equal "max-age=60", last_response.headers["Cache-Control"]
end
private
def app
Rails.application
end
end
Result
# Running:
I, [2022-06-27T16:51:22.390485 #51977] INFO -- : Started GET "/" for 127.0.0.1 at 2022-06-27 16:51:22 +0900
F
Failure:
BugTest#test_returns_success [cache_control.rb:45]:
Expected: "max-age=60"
Actual: "max-age=60, private"
rails test cache_control.rb:43
Finished in 0.224228s, 4.4597 runs/s, 4.4597 assertions/s.
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
While reverse proxies like Nginx can remove public/private headers, I prefer to complete with Rails.