Подтвердить что ты не робот

Кажется, что 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 */*

Что это значит?

4b9b3361

Ответ 1

Я видел, как это произошло из-за тега img с пустым атрибутом src. Придавая img, script, link или аналогичный тег, атрибут src или href ="" будет разрешен к текущей странице. Поэтому он попытается загрузить страницу во второй раз, пытаясь загрузить этот актив. Он также может быть в свойстве CSS url() или вызове AJAX.

Один простой способ рассказать - временно поставить что-то вроде <base href="http://example.com" /> в разделе <head>. Это будет префикс любых ссылок на странице, что должно препятствовать тому, чтобы ваша локальная страница вызывалась дважды, если это такая проблема.

Я также видел некоторые расширения браузера, которые запрашивают страницу в отдельном запросе. Я заметил это специально с Уведомление о веб-сервере и Уведомление о веб-технологиях расширения для Chrome. Попробуйте окно "инкогнито" или отдельный браузер и посмотрите, получится ли тот же результат.

Ответ 2

Я испытал это раньше, и виновником была плохая реализация Turbolinks (на моем конце).

Мне нужно было изучить правильный способ заставить Turbolinks работать (я включил свои учебные ресурсы внизу)... смотреть видео Ryan Bates посмотрите, как выглядит соответствующая работающая реализация.

Проблема/Виновник:

Является Javascript. Как описано на странице Turbolinks Github...

С Turbolinks страницы будут меняться без полной перезагрузки, поэтому вы не можете полагаться на DOMContentLoaded или jQuery.ready() для запуска вашего кода. Вместо этого Turbolinks запускает события в документе, чтобы обеспечить привязку к жизненному циклу страницы.

В принципе все, что подразумевает "запуск после загрузки DOM/страницы", будет ломаться/не работать, как ожидалось... это приведет к тому, что Turbolinks не будет эффективным. И поскольку Turbolinks изящно терпит неудачу, ваш браузер дважды загрузит страницу (проверьте журналы/консоль) и спрячет проблему для вас.

В моем случае я смог заметить вышеприведенное поведение, когда в режиме "инкогнито"... весь мой Javascript, который зависел от документа/DOM/готовой страницы..., сломался. Итак...

Решение:

Если у вас есть что-то подобное в вашем 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 и мои проблемы ушли.

Дальнейшее чтение:

Ответ 3

У нас была эта проблема с пустым исходным URL-адресом, заставляя перезагружать страницы рельсами.

Если параметр cover_url был пустым, это заставило бы перезагрузить страницу.

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

Ответ 4

Это поведение произошло для меня из-за расширения SPOF-O-Matic Chrome. Отключив его, был удален дополнительный запрос. Вы можете отключить его из chrome://extensions/

Ответ 5

Следуя подсказкам выше, я начал отключать расширения Chrome один за другим. В конце концов я отключил расширение AdBlock Plus, и это устранило проблему. Странно, когда я снова включил расширение, он все еще работал. Я понятия не имею, что это могло быть.