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 */* 

那是什么意思?

我见过这种情况是因为带有空白src属性的img标签。 给imgscriptlink或类似标签srchref attribute =""将解析为当前页面。 因此,当它尝试加载资源时,它会尝试第二次加载页面。 它也可以在CSS url()属性或AJAX调用中。

一个简单的方法是暂时在部分中添加 内容。 这将为页面上的任何链接添加前缀,如果出现这种问题,这将阻止您的本地页面被调用两次。

我还看到了一些浏览器扩展,它们在单独的请求中查询页面。 我特别注意到Chrome的Web服务器通知程序和Web技术通知程序扩展。 尝试“隐身”窗口或单独的浏览器,看看你是否得到相同的结果。

我以前经历过这个,罪魁祸首是Turbolinks的实施很糟糕(在我的最后)。

我必须学习使Turbolinks正常工作的正确方法(我已将我的学习资源包含在底部)… 观看Ryan Batesvideo ,看看顺便说一下正常工作的实现是什么样的。

问题/罪魁祸首:

是Javascript。 如Turbolinks Github页面所述 ……

使用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扩展,空白hrefs,我的问题已经消失。

进一步阅读:

  • Turbolinks如何运作
  • Turbolinks Railscast#390 by Ryan Bates(video)

我们有一个空白的背景url css这个问题,迫使页面重新加载rails。

如果cover_url参数为空,则会强制页面重新加载。

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

由于SPOF-O-Matic Chrome扩展,我的这种行为正在发生。 禁用它会删除额外的请求。 你可以从chrome:// extensions /中禁用它

继上述线索后,我开始逐一停用Chrome扩展程序。 最终我禁用了AdBlock Plus扩展,这解决了这个问题。 奇怪的是,当我重新启用扩展时,它仍然有效。 我不知道这可能是什么。