Rails:通过调用Ajax重定向
Rails: redirect with call to 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
,我定义如下:
(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>
以下是调用sessions#new
时执行的new.js.erb
:
$("#login-window").html("<%= escape_javascript(render 'sessions/new') %>");
因此,一旦调用sessions#new
,登录表单(即app/views/sessions
中的_new.html.erb
)将作为弹出窗口出现。
除了它必须被处理为JS而不是HTML。因此,我有以下链接,它位于_header.html.erb
中,可用于所有视图,以确保情况确实如此:
<%= link_to "Log in", login_path, {remote: true, 'data-toggle' => "modal", 'data-target' => '#login-window'} %>
单击链接时,此操作效果良好。这就是为什么我选择在logged_in_user
方法中使用redirect_to root_url
而不是redirect_to login_url
,因为后者会导致"缺少模板错误"。
但我真正想要的是让用户直接重定向到弹出窗口,而不是先重定向到root_url,然后点击"登录"链接才能进入表单。换句话说,我需要一种方法,通过发出Ajax请求以某种方式将用户重定向到sessions#new
,以便sessions#new
可以作为JS处理。
我在logged_in_user
方法中尝试了以下方法来实现所需的重定向,但都不起作用:
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"
通过修改以下文件解决了此问题:
(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
中编写了适用于所有视图模板的脚本。它的前半部分受到了嘎吱嘎吱的回答的启发。(谢谢你!)然后我添加了$("#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]
逻辑可能不是必需的(事实上,没有它它也能正常工作),但我添加了它只是以防万一。
就是这样:)
此外,对于那些想用引导程序实现弹出窗口功能的人来说,这里有一个我发现非常有用的博客:
https://coderwall.com/p/ej0mhg/open-a-rails-form-with-twitter-bootstrap-modals
编码快乐!
- AJAX不会在文件上传后重定向到网页-POST方法
- 我尝试在登录脚本中使用ajax,但页面不会重定向
- 如何使用Ajax调用特定的控制器和操作来重定向用户
- ASP.NET MVC 3-在ajax调用后,重定向到新页面或生成页面刷新
- 如何在ajax重定向中传递create-formbuilder
- Rails:通过调用Ajax重定向
- 如何完成表单后使用 AJAX 重定向并在其他页面上显示数据
- Javascript/Ajax重定向问题
- 如何使用 AJAX 重定向到下一页
- 如何使用 ajax 重定向到另一个具有隐藏值的页面
- JSF 1.2 AJAX 重定向到 URL
- 登录到一个站点,而不使用 jQuery/ajax 重定向到该站点
- 使用php和ajax重定向到另一个页面
- jQuery.post()并通过ajax重定向
- Fancybox ajax重定向而不是显示弹出窗口
- 如果找不到主机,Ajax重定向
- php发布后AJAX重定向返回true或无错误
- 使用Ajax重定向到WEB-INF中的jsp文件
- jQuery/Ajax:重定向后如何在目标页面上调用函数
- 如何用jquery $.ajax重定向到一个页面