Rails, devise, SPA, перенаправление на пользовательский URL (с параметром в строке запроса) после выхода из системы и входа в систему (sign_out, sign_in) - PullRequest
0 голосов
/ 08 мая 2018

У меня есть приложение Rails по умолчанию с devise gem, и некоторые маршруты полностью SPA (одностраничное приложение).

Если я захожу на эти страницы SPA (скажем, "/home"), и я не аутентифицирован (или сеанс окончен), он перенаправляет меня на:

  • "localhost:3000/users/sign_out"
  • и затем придумать "localhost:3000/users/sign_in"

Все хорошо, но.

Что мне сейчас нужно, так это то, что если я скажу «1017» и, как прежде, чем я не аутентифицируюсь или сеанс закончен, он перенаправляет меня на:

  • "localhost:3000/users/sign_out?continue=localhost:3000/home/jobs" (я делаю это с помощью JavaScript "window.location.replace")
  • но затем устройство перенаправляет меня на "localhost:3000/users/sign_in"
  • и после этого я теряю свои параметры "continue" в строке запроса и не могу перейти к "продолжить" URL после входа в систему.

Я знаю о after_sign_in_path_for и after_sign_out_path_for, но я думаю, что это не работает с параметрами в строке запроса, верно?

Это безумный сценарий?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы можете использовать stored_location_for и store_location_for. Этот пример взят из вики Devise How To: перенаправление на определенную страницу при успешном входе в систему .

# 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
0 голосов
/ 08 мая 2018

Это одна из проблем смешивания SPA-маршрутов и не-SPA-маршрутов. Я думаю, что предпочтительнее потерять некоторое время, переводя устройство в ответ только для API, а затем делая маршрутизацию сеанса пользователя также SPA.

Я не уверен, что если вы не можете получить доступ к параметрам запроса в контроллере устройства, вам следует проверить, возможно, вы можете это сделать, но если нет, то есть хотя бы один способ обойти это, и это было бы иметь before_action на вашем application_controller.rb перед любой логикой устройства, чтобы просто назначить ключ сеанса на основе параметров, а в вашем after_action удалить его, например (просто для иллюстрации):

#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
...