Браузер иногда отображает текст в формате JSON вместо желаемой страницы

#javascript #ruby-on-rails #ajax #jquery

#javascript #ruby-on-rails #ajax #jquery

Вопрос:

Я периодически сталкиваюсь с проблемой в моем приложении Rails, и у меня возникают проблемы с пониманием того, что происходит. Когда пользователь входит в систему, он видит панель мониторинга, содержащую некоторый JavaScript-код, который выполняет AJAX-вызов действия. Иногда, вместо того, чтобы видеть панель мониторинга, когда пользователь входит в систему, он видит текст ответа в формате JSON из действия вместо панели мониторинга (в Chrome) или загружает файл .json (Firefox). Это происходит периодически и обычно не происходит, но это действительно раздражает, когда это происходит.

Вот сокращенная версия некоторого кода:

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? — но я не смог проверить эту догадку. Кто-нибудь может сказать мне, что здесь может происходить? Я видел это в дикой природе и на других сайтах — тоже периодически, обычно не встречается, но раздражает, когда это происходит.

Ответ №1:

Есть ли у вас какой-либо код аутентификации, который использует store_location или подобную функциональность для перенаправления пользователя на определенную страницу после входа в систему?

Однажды у меня была похожая проблема, когда обратный вызов AJAX вызывал store_location для сохранения URL-адреса в формате JSON, и пользователь был перенаправлен на ответ в формате JSON, а не на свою панель мониторинга. Это было трудно отследить, потому что пользователю приходилось некоторое время бездействовать на странице, прежде чем ошибка проявлялась.

В любом случае, я подозреваю, что это что-то вроде этого, а не проблема с Rails.

Комментарии:

1. О, очень интересно. Мы не используем store_location специально, но у нас есть собственная реализация чего-то подобного. Я изучу и приму этот ответ, если это то, что происходит.

2. Вы выиграли! Это была моя проблема. Я записывал URL-адрес запроса AJAX и перенаправлял на него пользователя после входа в систему. Если пользователь вышел из системы, когда JS все еще опрашивал сервер, И пользователь вернулся на страницу входа, не перейдя по каким-либо другим ссылкам в приложении, эта проблема возникнет.

Ответ №2:

Я бы заподозрил тип содержимого HTTP-ответа и проверил все места, где вы его устанавливаете, на предмет возможных ошибок. Запустите свой браузер с расширением для отслеживания HTTP-заголовков, чтобы зафиксировать, каковы значения, когда это происходит.

Комментарии:

1. Что ж, насколько я могу наблюдать, похоже, он установлен правильно (application / json). Я нигде не устанавливаю его вручную — я думаю, что render: json должен позаботиться об этом — и я вижу Content-Type: application / json в Firebug и Chrome dev tools. Однако, когда я получаю 304 Not Modified, заголовок Content-Type отсутствует. Однако мне это кажется нормальным, поскольку я считаю, что у 304 не должно быть никакого текста в теле. Однако на самом деле я вижу файл 304, который все еще содержит тело JSON. Возможно, включение этого непустого тела в ответ 304 вызывает проблему в определенных ситуациях?