我正在使用ETag缓存来使用stale?
方法执行 Rails(4.1.1)操作;但是它没有考虑请求格式。示例:如果用户已加载/stations.json
,然后他们点击/stations
的链接,他们将获得缓存的JSON响应,而不是html。
我做错了还是这是一个Rails错误?
# GET /stations
# GET /stations.json
def index
@title = "Stations"
@last_updated = Station.order("updated_at asc").last
if stale?(@last_updated, last_modified: @last_updated.try(:updated_at))
@stations = all_with_latest_observation
respond_to do |format|
format.html
format.json { render json: @stations }
end
end
end
答案 0 :(得分:1)
我认为你应该添加密钥:etag,当你打电话陈旧?方法
# GET /stations
# GET /stations.json
def index
@title = "Stations"
@last_updated = Station.order("updated_at asc").last
if stale?(etag: @last_updated, last_modified: @last_updated.try(:updated_at))
@stations = all_with_latest_observation
respond_to do |format|
format.html
format.json { render json: @stations }
end
end
end
然后让我们看看它发生了什么!
答案 1 :(得分:0)
我找到了解决方法
class ApplicationController
etag { request.format }
end
当然是规范:
describe StationsController do
describe "GET index" do
describe "ETag" do
before { get :index, format: 'json' }
it "should not use the same ETag for different content types" do
get :index, format: 'json'
first_response = response.headers.clone
get :index, format: 'html'
expect(first_response['ETag']).to_not eq (response.headers['ETag'])
end
end
end
end