从rails控制器

时间:2015-10-31 09:59:43

标签: jquery ruby-on-rails ruby

我使用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.";
  });

1 个答案:

答案 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,为您解决大部分问题。