2013-07-15 73 views
4

我使用下面的代碼從一個耙子任務中在服務器上執行的請求:強制的Rails的app.get重做請求

app = ActionDispatch::Integration::Session.new(Rails.application) 
app.host!('localhost:3000') 
app.get(path) 

這種運作良好。

但是,如果我再次調用app.get(path)具有相同路徑,則不會重複該請求,並返回以前的結果。

有沒有一種方法可以強制app.get重複調用?

+1

你怎麼知道第二個'app.get(path)'不重複請求?我只是查看了「ActionDispatch :: Integration :: Session」的代碼,並沒有指出任何緩存。 – henrikhodne

+0

@henrikhodne控制器中存在的任何'puts'方法將爲第一個請求輸出路由。 –

+0

@henrikhodne你是對的。它不是執行任何緩存的'ActionDispatch :: Integration :: Session',而是標準的rails緩存管道做的事情,就像標準的HTTP請求一樣。我已經詳細闡述了我的答案。 –

回答

1

我已經弄清楚發生了什麼事情。

基本上,「請求不重複」的觀察結果是Rails自己的緩存行爲。有意義的是,app.get被視爲任何其他請求,如果啓用了緩存,則會返回緩存,如果不是,則會重複(如@henrikhodne聲明的那樣)。這就解釋了爲什麼緩存控制器中的puts第二次不會輸出。

要驗證,請在2個控制器方法中添加一個puts,但僅在第二個方法中設置expires_in。第一個將重複輸出,第二個不會。

強制重複請求的方法是通過修改URL來緩存緩存。與使用HTTP時一樣, app.get("/")將變爲app.get("/?r=123456")。事後看來這一切似乎都很明顯,基本上app.get被完全視爲客戶端請求,並且所有相同的規則都適用。

1

嘗試重置會話:

app.reset! 

這裏是如何工作的,當復位,

def reset! 
    @https = false 
    @controller = @request = @response = nil 
    @_mock_session = nil 
    @request_count = 0 
    @url_options = nil 

    self.host  = DEFAULT_HOST 
    self.remote_addr = "127.0.0.1" 
    self.accept  = "text/xml,application/xml,application/xhtml+xml," + 
         "text/html;q=0.9,text/plain;q=0.8,image/png," + 
         "*/*;q=0.5" 

    unless defined? @named_routes_configured 
     # the helpers are made protected by default--we make them public for 
     # easier access during testing and troubleshooting. 
     @named_routes_configured = true 
    end 
    end 

否則將只是重新使用最後一個響應:

# this is a private method in Session, it will called every time you call `get/post, etc` 
def process 
    ...... 
    @request_count += 1 
    @request = ActionDispatch::Request.new(session.last_request.env) 
    response = _mock_session.last_response 
    @response = ActionDispatch::TestResponse.new(response.status, response.headers, response.body) 
    @html_document = nil 
    .... 
end 

祝你好運!

+1

它實際上不重用最後一個響應。如果你在代碼中看起來更深一層,它會將請求發送到'_mock_session',覆蓋'last_response'屬性。不過,'#reset!'可能仍然有效。 – henrikhodne

+0

'app.reset!'在我的測試中沒有影響。我的問題是鐵路自己的緩存系統被激活(因爲它是一個正常的HTTP請求),請參閱我的答案。我感謝你的幫助,雖然這調查! –