我试图将未登录的用户直接重定向到登录窗口,这是一个引导模式窗口。
我在<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
任何建议都将不胜感激!
答案 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
快乐的编码!