Javascript Rails:通过调用Ajax重定向
我试图将未登录的用户直接重定向到登录窗口,这是一个引导模式窗口 我在Javascript Rails:通过调用Ajax重定向,javascript,jquery,ruby-on-rails,ajax,redirect,Javascript,Jquery,Ruby On Rails,Ajax,Redirect,我试图将未登录的用户直接重定向到登录窗口,这是一个引导模式窗口 我在ApplicationController中编写了一个名为logged\u in\u user的方法: def logged_in_user unless !current_user.nil? flash[:danger] = "Please log in" redirect_to root_url end end login_url路由到sessions#new,我将其定义如下: (sessions_
ApplicationController
中编写了一个名为logged\u in\u user
的方法:
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\u to root\u url
指向的视图:
<!-- Login Window -->
<div id="login-window" class="modal fade" role="dialog" aria-labelledby="login" aria-hidden="true"></div>
因此,登录表单,即app/views/sessions
中的\u new.html.erb
,将在调用sessions#new
后显示为弹出窗口
只是它必须作为JS而不是HTML进行处理。因此,我有以下链接,它位于\u header.html.erb
中,可用于所有视图,以确保这种情况:
<%= link_to "Log in", login_path, {remote: true, 'data-toggle' => "modal", 'data-target' => '#login-window'} %>
如有任何建议,将不胜感激 只要加上这个
<script type="text/javascript">
$(document).ready(function() {
if(window.location.href.indexOf('#login-window') != -1) {
$('#login-window').modal('show');
}
});
</script>
通过修改以下文件解决了此问题:
(application_controller.rb) 我省略了
flash[:danger]
,因为它显示在褪色的屏幕后面
屏幕。我添加了request.referer
,以确保登录弹出窗口出现在用户发出请求的位置,而不是将其重定向到根路径。我认为这对用户体验会更好。(三元组只是用来处理请求的情况。referer
可以是nil
,在这种情况下,代码会出现错误。)
下面解释会话[:modal]=true
背后的主题
(位于application.html.erb的底部)
$(文档).ready(函数(){
if(window.location.href.indexOf(“#登录窗口”)!=-1){
$(“#登录窗口”).modal('show');
$(“#登录窗口”).html(“”);
}
});
这里我直接在视图模板中使用javascript。由于弹出窗口显示的视图模板不限于一个特定的模板,因此我已经在application.html.erb
中列出了脚本,该脚本适用于所有视图模板。上半部分的灵感来自于作者的回答。(谢谢cruncher!)然后我添加了$(“#登录窗口”).html(“”)
以确保登录表单(`app/views/sessions/_new.html.erb)确实出现
现在,由于我希望登录弹出窗口仅在非登录用户尝试访问需要登录的页面时出现,因此我继续添加了session[:modal]=true
,以指示确实调用了logged\u in\u user
方法,这意味着确实发生了上述情况
然后,在application.html.erb
中,我可以通过
检查弹出窗口是否应该出现。如果是这种情况,那么脚本将被执行,然后我将session[:modal]
的值设置为false
这个会话[:modal]
逻辑可能不是必需的(事实上,没有它,它工作得很好),但我添加它只是为了以防万一
就这样:) 另外,对于那些希望通过引导实现此弹出窗口功能的人,我发现以下博客非常有用:
快乐编码 谢谢你的回答。很接近!虽然您的代码实现了所需的视觉效果(即淡入淡出),但表单本身并未显示。whats point load session/new by
$(“#登录窗口”).html(“”)代码>?当数据是动态的时使用ajax。“会话/新建”是动态html吗?我认为-不。只需通过渲染加载到html.erb中即可。如果表单是模态引导且没有js错误,那么它必须出现。好吧,它只是供用户“点击”名为“登录”的链接。无论如何,这个问题是在你的建议的启发下解决的。我会自己贴答案的。非常感谢您富有洞察力的建议!因此,该模式仅显示需要用户登录的页面/链接何时打开?在我的应用程序中,当用户单击标题中的链接“登录”时,该模式也会打开。如果浏览器上未启用Java脚本会发生什么情况请在有时间时更新您的发现,这是一个非常有用的主题
render js: "window.location = <%= escape_javascript(render 'sessions/new') %>"
render js: "window.location = '/sessions/new'"
redirect_to login_url, format: "js"
<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"
def logged_in_user
unless !current_user.nil?
session[:modal] = true
redirect_to !request.referrer.nil? ? (request.referer + "#login-window") : "#login-window"
end
end
<% 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 %>