#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 вызывает проблему в определенных ситуациях?