Rails似乎两次为该页面提供服务

时间:2011-04-26 05:23:48

标签: ruby-on-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 */*

这是什么意思?

7 个答案:

答案 0 :(得分:39)

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

一种简单的方法是暂时在<base href="http://example.com" />部分添加<head>之类的内容。这将为页面上的任何链接添加前缀,如果出现这种问题,这将阻止您的本地页面被调用两次。

我还看到了一些浏览器扩展,它们在单独的请求中查询页面。我已经特别注意到了Chrome的Web Server NotifierWeb Technology Notifier扩展程序。尝试“隐身”窗口或单独的浏览器,看看是否得到相同的结果。

答案 1 :(得分:8)

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

我必须学习使Turbolinks正常工作的正确方法(我已将我的学习资源包含在底部)...... 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扩展程序,空白-hrefs,我的问题已经消失。

进一步阅读:

答案 2 :(得分:3)

我们遇到了这个问题,背景为空白的url css,强制用rails重新加载页面。

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

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

答案 3 :(得分:1)

由于SPOF-O-Matic Chrome扩展程序,我发生了这种情况。禁用它会删除额外的请求。您可以从chrome:// extensions /

中禁用它

答案 4 :(得分:0)

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

答案 5 :(得分:0)

可以尝试的方法,但是我只是关闭了标签并打开了一个新标签,这为我解决了这个问题。

答案 6 :(得分:0)

只需添加我遇到的问题,这些问题就是上面提到的问题加上application.js中Turbolink的顺序的组合

第一期

在错误的位置需要涡轮链接

//= require jquery3
//= require jquery_ujs
//= require popper
//= require bootstrap
//= require turbolinks
//= require_tree .

第一个解决方案

在jquery3之后需要涡轮链接

//= require jquery3
//= require turbolinks
//= require jquery_ujs
//= require popper
//= require bootstrap
//= require_tree .

此更改后,我注意到页面的加载速度要快得多,但仍然加载两次。

第二期

AddBlocker extension 

第二个解决方案

Use Incognito