У вас будет два варианта для реализации этого:
Вариант 1: Использование события window.beforeunload
. ссылка
$('.popup-link').click(function() {
showPopup();
$(window).on("beforeunload", hidePopup);
});
$('.popup-close').click(hidePopup);
function hidePopup() {
$(window).off("beforeunload", hidePopup);
$('.popup').removeClass('active');
}
Вариант 2: Использование API истории HTML5. Ссылка
$('.popup-link').click(function() {
showPopup();
window.history.pushState('popup-open', null, '');
$(window).on('popstate', hidePopup);
});
$('.popup-close').click(function() {
if(history.state == 'popup-open') {
window.history.back();
}
hidePopup();
});
function hidePopup() {
$(window).off('popstate', hidePopup);
$('.popup').removeClass('active');
}
Редактировать : Суджумаи Идея тоже довольно хорошая. Демо
Кроме того, я рекомендую регистрировать события popstate
/ beforeunload
только при необходимости и отменять их регистрацию, когда они вам больше не нужны, чтобы избежать накладных расходов.
edit_report_path
генерирует URL с идентификатором @report
в нем.
redirect_to
по существу создает совершенно новый запрос и переходит к тому URL. Когда это добирается до edit
, все, что это имеет, является идентификатором. Обычно это прекрасно - это ищет объект и продолжает идти, но конечно это не будет иметь поле недб, которое Вы устанавливаете.
Существует пара способов зафиксировать это. Можно использовать: представьте вместо этого для получения до страницы редактирования - затем @report, установят поле.
@report.mode = "t"
render :action => edit and return
Или, можно сделать mode
поле базы данных.
Проблема здесь находится в redirect_to
. Когда Вы перенаправляете где-то в другом месте все переменные экземпляра, потеряны. Таким образом, когда Вы устанавливаете @report.mode = "t"
это устанавливает атрибут. Но то, когда Вы перенаправляете те данные, потеряно.
Я принимаю <%= build_report(@report.mode) %>
находится в edit_report.html.erb и коде от того, когда Вы устанавливаете 'режим', не находится в действии редактирования. Если это верно, Вы можете передавать report.mode
к действию редактирования в URL как так:
build_report(@report.mode, :mode => "t")
Проблема redirect_to
; Вы возвращаете ответ клиенту, который заставляет его восстанавливать запрос с другим URL. В том втором запросе не установлен режим, потому что Вы не сохранили его перед оборачиванием первого запроса.