注销和登录后,Rails,设计,SPA,重定向到自定义URL(在查询字符串中使用参数)(sign_out,sign_in)

时间:2018-05-08 13:07:36

标签: ruby-on-rails ruby redirect devise url-redirection

我有一个带有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_forafter_sign_out_path_for,但我认为这不适用于查询字符串中的参数,对吗?

这是一个疯狂的场景吗?

2 个答案:

答案 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_forstore_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