我有一个带有devise
gem的默认Rails应用程序,有些路由完全是SPA(单页应用程序)。
如果我继续访问SPA页面(让我们说“/home
”)并且我没有通过身份验证(或会话已结束),则会将我重定向到:
localhost:3000/users/sign_out
”localhost:3000/users/sign_in
”一切都很好,但是。
我现在需要的是,如果我在我未经过身份验证或会话结束之前让我们说“/home/jobs
”之类的,那么我会重定向到:
localhost:3000/users/sign_out?continue=localhost:3000/home/jobs
”(我使用javascript“window.location.replace”执行此操作)localhost:3000/users/sign_in
”continue
”参数,登录后我无法继续“继续”。我知道after_sign_in_path_for
和after_sign_out_path_for
,但我认为这不适用于查询字符串中的参数,对吗?
这是一个疯狂的场景吗?
答案 0 :(得分:0)
这是混合SPA路线和非SPA路线的一个问题。我认为最好放弃一些前期时间将设计转换为仅api响应,然后使用户会话路由也是SPA。
我不确定你是否无法访问设计控制器中的请求参数,你应该检查,也许你可以,但如果没有,至少有另一种方法你可以解决这个问题,那将是在任何设计逻辑之前,before_action
上都有一个application_controller.rb
,只需根据参数分配一个会话密钥,并在after_action
删除它,例如(仅用于说明):< / p>
#application_controller.rb
before_action :set_continue
#...
def set_continue
if params[:continue]
session[:continue] = params[:continue]
end
end
然后,您可以在after_sign_in_path
:
def after_sign_in_path_for(resource)
if session[:continue]
navigation = session[:continue]
session[:continue] = nil
navigation
else
your_regular_path_helper #or super I guess
end
end
答案 1 :(得分:0)
您可以使用stored_location_for
和store_location_for
。此示例取自Devise wiki的How To: redirect to a specific page on successful sign in。
# some_controller.rb (or even the application_controller)
if params[:redirect_to].present?
store_location_for(resource, params[:redirect_to])
end
# application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
protected
def after_sign_in_path_for(resource)
sign_in_url = new_user_session_url
if request.referer == sign_in_url
super
else
stored_location_for(resource) || request.referer || root_path
end
end
end