2011-04-13 31 views
5

我在Rails應用程序中遇到了一個間歇性問題,我無法弄清楚發生了什麼。當用戶登錄時,他們會看到一個儀表板,其中包含一些對操作執行AJAX調用的JavaScript代碼。有時候,用戶登錄時不是看到儀表板,而是從操作中而不是儀表板(在Chrome中)看到JSON響應文本,或者下載.json文件(Firefox)。它是間歇性的,通常不會發生,但它確實發生時真的很煩人。瀏覽器有時會顯示JSON文本而不是所需的頁面

下面是一些代碼的簡單化版本:在模板頭運行

JS:

$(function() { 
    var remoteLink = $('#remoteLink'); 
    remoteLink.live("ajax:complete", function() { 
     setTimeout(function() { 
      loadCount(); 
     }, 30000); 
    });  

    loadCount(); 

    function loadCount() { 
     remoteLink.click(); 
    } 
}); 

而且在模板中的鏈接:

<%= link_to 'get count (hidden)', {:controller => 'something', :action => 'count'}, 
      :id => 'remoteLink', :class => 'hidden', :remote => true, 'data-type' => 'json' %> 

而且控制器動作:

def count 
    render :json => get_counts_function_returning_a_hash 
end 

我的直覺是它是一種競爭條件 - 可能與使用setTimeout有關? - 但我無法驗證預感。任何人都可以告訴我這裏可能會發生什麼?我也在其他網站上看到過這種情況 - 也是間歇性的,一般不會發生,但是當它發生時很煩人。

回答

4

您是否有任何身份驗證代碼使用store_location或類似功能在用戶登錄後將用戶重定向到特定頁面?

我曾經有過類似的問題,其中AJAX回調導致store_location存儲JSON URL,並且用戶被重定向到JSON響應而不是他們的儀表板。這很難追查到,因爲用戶必須在頁面閒置一段時間才能發現錯誤。

在任何情況下,我懷疑它是這樣的,而不是Rails的問題。

+0

哦,非常有趣。我們沒有專門使用store_location,但我們有自己的類似實現。如果這是正在發生的事情,我會調查並接受這個答案。 – Jeff 2011-04-16 05:48:33

+0

你贏了!那是我的問題。我記錄了AJAX請求URL並在登錄後將用戶轉發給它。如果用戶在JS仍在輪詢服務器時註銷,並且用戶返回到登錄頁面而沒有單擊應用程序中的任何其他鏈接,則會發生此問題。 – Jeff 2011-04-16 06:37:30

0

我會懷疑HTTP響應的內容類型,並檢查您正在設置它的任何地方以查找可能的錯誤。運行帶有用於跟蹤HTTP頭的擴展的瀏覽器,以捕獲值發生時的值。

+0

那麼,據我所知,它似乎設置正確(application/json)。我不會在任何地方手動設置它 - 我認爲渲染:json應該注意這一點 - 我在Firebug和Chrome開發工具中看到了Content-Type:application/json。但是,當我得到304 Not Modified時,沒有Content-Type標頭。雖然這對我來說似乎很好,因爲我相信304應該沒有任何文字。然而,我真正看到的是一個仍然包含JSON主體的304。在某些情況下,在304響應中包括這個非空的身體可能會導致問題? – Jeff 2011-04-13 19:05:07

相關問題