Rails:调用Ajax重定向

时间:2016-04-29 17:38:34

标签: javascript jquery ruby-on-rails ajax redirect

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

我在<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"/> <button id="arrowdown"> <i class="icn fa fa-chevron-down fa-2x"></i> </button><button id="arrowup"> <i class="icn fa fa-chevron-up fa-2x"></i> </button> <button id="arrowdown"> <i class="icn fa fa-chevron-down fa-2x"></i> </button><button id="arrowup"> <i class="icn fa fa-chevron-up fa-2x"></i> </button> <button id="arrowdown"> <i class="icn fa fa-chevron-down fa-2x"></i> </button>中编写了一个名为logged_in_user的方法:

ApplicationController

def logged_in_user unless !current_user.nil? flash[:danger] = "Please log in" redirect_to root_url end end 路由到login_url,我定义如下:

sessions#new

以下是(sessions_controller.rb) def new respond_to do |format| format.html format.js end end 指向的视图:

redirect_to root_url

以下是 <!-- Login Window --> <div id="login-window" class="modal fade" role="dialog" aria-labelledby="login" aria-hidden="true"></div> new.js.erb被调用时执行:

sessions#new

因此,$("#login-window").html("<%= escape_javascript(render 'sessions/new') %>"); 中的_new.html.erb登录表单会在调用app/views/sessions后显示为弹出窗口。

除了它必须作为JS而不是HTML处理。所以我在sessions#new中有以下链接,并且可以在所有视图中使用,以确保是这种情况:

_header.html.erb

单击链接时,此工作正常。这就是为什么我选择在<%= link_to "Log in", login_path, {remote: true, 'data-toggle' => "modal", 'data-target' => '#login-window'} %> 方法中执行redirect_to root_url而不是redirect_to login_url,因为后一种方法会导致&#34;缺少模板错误&#34;。

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

我在sessions#new方法中尝试了以下方法进行所需的重定向,但没有一种方法有效:

logged_in_user

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:1)

只需添加此

即可
<script type="text/javascript">
  $(document).ready(function() {

  if(window.location.href.indexOf('#login-window') != -1) {
    $('#login-window').modal('show');
  }

});

</script>

并且

redirect_to root_url+"#login-window"

答案 1 :(得分:1)

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

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 %>
  <script type="text/javascript">
    $(document).ready(function() {
      if(window.location.href.indexOf('#login-window') != -1) {
        $('#login-window').modal('show');
        $("#login-window").html("<%= escape_javascript(render 'sessions/new') %>");
      }
    });
  </script>
  <% 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实现此弹出窗口功能的人,这里有一个我发现非常有用的博客:

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

快乐的编码!