我使用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
我会得到双重渲染错误。实现这一目标的最佳方法是什么?
修改
conform_dialog.html.haml
:javascript
jQuery(window).on("beforeunload", function(){
return "This will reload the page.";
});
答案 0 :(得分:1)
您 能够拉出&#34;确认框&#34;超出控制器,除此之外,您最好将代码直接放入ApplicationController
:
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_filter :some_method
private
def some_method
...
end
end
您遇到的问题是HTML请求有来加载新页面。浏览器希望响应格式化为HTML,它将用于填充新视图。
如果您尝试显示&#34;确认框&#34;通过这个流程,您需要使用Javascript / JQuery(在刷新之前),或者您必须呈现整个&#34;确认&#34;页:
-
如果您想使用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?");
};
这将显示一个简单的JS&#34; confiramtion&#34;框(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可以更快地在您的Web应用程序中建立以下链接。它不是让浏览器在每个页面更改之间重新编译JavaScript和CSS,而是使当前页面实例保持活动状态,并仅替换头部中的正文(或部分)和标题。想想CGI与持久性过程。
默认情况下,所有Rails应用程序都与turbolinks
捆绑在一起(如果您不知道如何使用它进行编码,则会很烦人。)
因此,如果您的方法出现问题,您可能希望恢复为Turbolinks,为您解决大部分问题。