2011-04-26 17 views
18

這是我在本地日誌文件中看到,當我做一個頁面請求:的Rails似乎提供該頁面兩次

Started GET "/" for 127.0.0.1 at Mon Apr 25 22:12:22 -0700 2011 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 2) LIMIT 1 
    Processing by PagesController#beta as HTML 
Rendered pages/beta.html.erb within layouts/beta (16.2ms) 
Completed 200 OK in 23ms (Views: 18.8ms | ActiveRecord: 7.7ms) 


Started GET "/" for 127.0.0.1 at Mon Apr 25 22:12:23 -0700 2011 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 2) LIMIT 1 
    Processing by PagesController#beta as */* 
Rendered pages/beta.html.erb within layouts/beta (17.9ms) 
Completed 200 OK in 27ms (Views: 21.5ms | ActiveRecord: 6.6ms) 

任何人有任何的想法可能會造成什麼呢?處理線很有趣?

PagesController#beta as HTML 
PagesController#beta as */* 

這是什麼意思?

+0

你的控制器是什麼樣的? – 2011-04-26 05:38:51

+0

讀者,不要把這與[Rails打印每個日誌行兩次](https://stackoverflow.com/questions/19900093/rails-logger-appears-to-be-duplicating-log-lines)混淆。 – Zaz 2014-08-04 20:50:35

回答

34

我見過這種情況,因爲img標籤帶有空白src屬性。給出imgscript,link或類似標記srchref屬性=""將解析爲當前頁面。因此,它會嘗試在加載資產時再次加載頁面。它也可能位於CSS url()屬性或AJAX調用中。

一個簡單的方法是暫時在您的<head>部分中放置類似<base href="http://example.com" />的東西。這將以頁面上的任何鏈接爲前綴,這將阻止本地頁面被調用兩次,如果它是這樣的問題。

我也見過一些瀏覽器擴展,在單獨的請求中查詢頁面。我特別注意到Chrome的Web Server NotifierWeb Technology Notifier擴展。嘗試一個「隱身」窗口或單獨的瀏覽器,看看你是否得到相同的結果。

+1

upvoted你的答案爲鉻的w3c內聯驗證插件是我的情況下的罪魁禍首。感謝您的洞察力。 – 2011-09-30 10:13:07

+1

我的罪魁禍首是Chrome的Firebug。嘗試禁用它。 – muirbot 2012-01-19 22:59:25

+0

SPOFMATIC對我來說 – TomFuertes 2014-01-31 23:43:00

0

由於Chrome擴展程序爲SPOF-O-Matic,我的這一行爲正在發生。禁用它刪除了額外的請求。你可以從chrome中禁用它:// extensions/

8

我之前經歷過這個,罪魁禍首是Turbolinks(在我的結尾)的糟糕實現。

我不得不學習讓Turbolink工作的正確方法(我已將自己的學習資源包含在底部)...... watch the Ryan Bates video瞭解正確工作的實現的順序。

問題/罪魁禍首:

是的JavaScript。作爲對Turbolinks Github page描述...

隨着Turbolinks頁面會更改,恕不全部重新加載,所以你不能依靠DOMContentLoaded或jQuery.ready()來觸發你的代碼。相反,Turbolinks會在文檔上觸發事件以提供頁面生命週期的掛鉤。

基本上任何暗示「後DOM /頁運行加載」將打破/不工作作爲預期......這將導致Turbolinks不有效。並且由於Turbolinks正常失敗,您的瀏覽器會將該頁面加載兩次(檢查日誌/控制檯)併爲您隱藏問題。

在我的情況下,我在'隱身模式'時能夠注意到上述行爲......所有依賴於文檔/ DOM /頁面準備好的Javascript都打破了。所以......

解決方案:

如果你在你的JavaScript(如下圖)這樣的事......

$(function() { 
    alert("DOM is ready!"); 
}); 

$(document).ready(function() { 
    alert("DOM is ready!"); 
}); 

jQuery(document).ready(function() { 
    alert("DOM is ready!"); 
}); 

更改這個...

$(document).on('page:change', function() { 
    alert("DOM is ready!"); 
}); 

Turbolinks實際上並沒有一個全新的頁面不要求,所以你會發現你的Javascript僅適用於全頁面加載但不是當您從Turbolink啓用的鏈接點擊。

這意味着我們應該依靠Turbolinks來檢測DOM準備好的內容。

在我看來,目前的答案是(可以)錯了,因爲我有Chrome擴展,空白的HREF和我的問題都沒有了。

延伸閱讀:

+0

這也是我的問題。評論出Turbolinks javascript立即導致雙重負載消失。 – 2016-10-05 01:41:30

2

我們有這個問題,用空白的背景URL的CSS,迫使與軌道重新加載頁面。

如果cover_url參數爲空,它將強制頁面重新加載。

"style" = "background: url(#{cover_url});" 
0

從上面的線索開始,我開始逐個禁用Chrome擴展。最終我禁用了AdBlock Plus擴展,並解決了這個問題。奇怪的是,當我重新啓用擴展它仍然工作。我不知道這可能是什麼。