Rails缓存提供错误的响应格式

时间:2014-09-13 12:38:19

标签: ruby-on-rails ruby caching

我正在使用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

2 个答案:

答案 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)

这似乎是bug in ActionPack

我找到了解决方法

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