2015-10-31 2 views
1

У меня есть мой сайт, используя ajaxify_rails GEM. Теперь все запросы имеют тип JS, единственный запрос, который может быть типа html - это обновление страницы. Я хочу отобразить окно конформации с запросом пользователя «Хочет ли он продолжить или нет» на каждый html запрос. Чтобы код был общим, я хочу, чтобы он присутствовал в base_controller. Можно ли это достичь?Показать диалоговое окно конфигурации с контроллера рельсов

Если я стараюсь следующее:

BaseController < ApplicationController 
    def some_method 
    if !request.xhr? 
     render :template => "conform_dialog" #using jQuery way of showing confirmation box 
    end 
    end  
end 

OtherControllers 

before_filter :some_method 

я получить двойную ошибку рендеринга. Каков наилучший способ достичь этого?

EDIT

conform_dialog.html.haml

:javascript 
    jQuery(window).on("beforeunload", function(){ 
    return "This will reload the page."; 
    }); 
+0

Rails имеет встроенный помощник для такого рода вещей, но только при отправке форм. Если вы хотите включить это в опубликованных формах, см. Этот ответ: http://stackoverflow.com/a/15771639/3270759. –

+0

@SamDavies Привет, спасибо за предложение. Я хочу, чтобы конформация появлялась при перезагрузке каждой страницы, и каждая страница может не иметь формы. – Abhi

ответ

1

Вы будете не быть в состоянии потянуть "окно подтверждения" из контроллера, и к тому же вы будете лучше всего поставить ваш код непосредственно в ApplicationController:

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    before_filter :some_method 

    private 

    def some_method 
     ... 
    end 
end 

Проблема заключается в том, что в запросе HTML есть, чтобы загрузить новую страницу. Браузер ожидает, что ответ будет отформатирован HTML, который он будет использовать для заполнения нового представления.

Если вы пытаетесь показать «окно подтверждения» через этот поток, вы будете должны использовать JavaScript/JQuery (перед обновлением), или вы будете иметь, чтобы сделать весь «подтверждение» страницу:

-

Если вы хотите использовать метод подтверждения JS, вы должны использовать onbeforeunload вызов:

Displaying a confirm dialog box when the user tries to refresh/close/navigate to another web page

window.onbeforeunload = function (e) { 
    e = e || window.event; 

    // For IE and Firefox prior to version 4 
    if (e) { 
    e.returnValue = confirm("Really?"); 
    } 

    // For others 
    return confirm("Really?"); 
}; 

Это покажет простую коробку «confiramtion» JS (ok/cancel), которая позволяет вам определить рост.

-

Если вы хотите использовать действие контроллера, вы должны отобразить страницу подтверждения в виде отдельного запроса HTML:

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    before_filter :confirmation, if: Proc.new{ |c| !c.request.xhr? } 

    private 

    def confirmation 
     if request.get? 
     @page = request.referrer 
     elsif request.post? 
     render request.referrer 
     end 
    end 
end 

#app/views/application/confirmation.html.erb 
<%= button_to "Really?", confirmation_path %> 

Я не использовал ajaxify_rails перед тем , но я уверен, что Turbolinks делает то же самое ...

Turbolinks делает следующие ссылки в лету ур веб-приложений быстрее. Вместо того чтобы позволить браузеру перекомпилировать JavaScript и CSS между каждой сменой страницы, он сохраняет текущий экземпляр страницы живым и заменяет только тело (или части) и заголовок в голове. Подумайте о CGI против постоянного процесса.

По умолчанию все приложения Rails поставляются в комплекте с turbolinks (это может раздражать, если вы не знаете, как его кодировать).

Таким образом, если у вас возникнут проблемы с вашим подходом, вы можете вернуться к Turbolinks, устранив большую часть проблемы для вас.

+0

Благодарим вас за ответ. Я также пытаюсь показать jQuery способ отображения конформации. Я переместил свой код в Application Controller. Но, это показывает мне пустую страницу, я ли я оставляю страницу ** или ** Оставайтесь на странице **. – Abhi

Смежные вопросы