Rails:调用Ajax重定向

我正在尝试将未登录的用户直接重定向到登录窗口,这是一个引导模式窗口。

我在ApplicationController编写了一个名为logged_in_user的方法:

 def logged_in_user unless !current_user.nil? flash[:danger] = "Please log in" redirect_to root_url end end 

login_url路由到sessions#new login_url ,我定义如下:

 (sessions_controller.rb) def new respond_to do |format| format.html format.js end end 

以下是redirect_to root_url指向的视图:

    

这是在new.js.erb时执行的new.js.erb

 $("#login-window").html(""); 

因此,一旦调用sessions#new _new.html.erb ,登录表单( app/views/sessions _new.html.erb将显示为弹出窗口。

除了它必须作为JS而不是HTML处理。 所以我有以下链接,它位于_header.html.erb ,可在所有视图中使用,以确保是这种情况:

  "modal", 'data-target' => '#login-window'} %> 

单击链接时,此工作正常。 这就是为什么我选择在logged_in_user方法中执行redirect_to root_url而不是redirect_to login_url ,因为后一种方法导致“缺少模板错误”。

但我真正想要的是将用户直接重定向到弹出窗口,而不是首先将它们重定向到root_url并且必须单击“登录”链接才能输入表单。 换句话说,我需要一种方法以某种方式通过发出Ajax请求将用户重定向到sessions#new #new,以便可以将会话#new作为JS处理。

我尝试了以下方法在logged_in_user方法中进行所需的重定向,其中没有一个工作:

 render js: "window.location = " render js: "window.location = '/sessions/new'" redirect_to login_url, format: "js" 

任何建议将不胜感激!

只需添加这个

  

 redirect_to root_url+"#login-window" 

通过修改以下文件解决了此问题:


application_controller.rb

 def logged_in_user unless !current_user.nil? session[:modal] = true redirect_to !request.referrer.nil? ? (request.referer + "#login-window") : "#login-window" end end 

我省略了flash[:danger]因为它显示在褪色屏幕的“后面”。 我添加了request.referer以确保登录弹出窗口出现在用户发出请求的位置,而不是将它们重定向到root_path。 我认为这对用户体验会更好。 (三元组只是处理request.referer可能nil ,在这种情况下代码会引发错误。) session[:modal] = true背后的主题解释如下。


(在application.html.erb的底部)

 <% if session[:modal] == true %>  <% session[:modal] = false %> <% end %> 

这里我直接在视图模板中使用javascript。 由于弹出窗口出现的视图模板不限于一个特定模板,因此我在application.html.erb找到了适用于所有视图模板的脚本。 它的前半部分受到了cruncher的回答的启发。 (谢谢cruncher!)然后我添加了$("#login-window").html("<%= escape_javascript(render 'sessions/new') %>"); 确保登录表单(“app / views / sessions / _new.html.erb)确实出现。

现在,因为我希望登录弹出窗口仅在非登录用户尝试访问需要登录的页面时出现,我继续添加session[:modal] = true以指示确实调用了logged_in_user方法,这意味着确实发生了上述情况。

然后,在application.html.erb我可以检查弹出窗口是否应该由<% if session[:modal] == true %> 。 如果是这种情况,那么脚本将被执行,之后我将session[:modal]的值设置为false

这个session[:modal]逻辑可能没有必要(事实上,没有它它工作正常),但我已添加它以防万一。


而已 :)

此外,对于那些想要使用bootstrap实现此弹出窗口function的人,这里有一个我发现非常有用的博客:

https://coderwall.com/p/ej0mhg/open-a-rails-form-with-twitter-bootstrap-modals

快乐的编码!