Если кто-то все еще ищет работу вокруг. Я смог решить это следующим образом:
Сначала создайте контроллер Sessions, унаследованный от Devise::SessionsController
class SessionsController < Devise::SessionsController
def new
get_pre_login_url(request.referer)
super
end
def create
@@referer_url
super
end
private
def get_pre_login_url(url)
@@referer_url = url
end
def after_sign_in_path_for(resource)
# @@referer_url
sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')
if @@referer_url == sign_in_url
super
else
stored_location_for(resource) || @@referer_url || root_path
end
end
end
Вы заметите, что я устанавливаю переменную класса (@@variable_name
), которая мне не очень нравится, но это то, что я придумал после 4 часов, пытаясь найти другие способы решения этой проблемы. Я также стараюсь быть осторожным, чтобы не слишком сильно портить контроллер Devise и использовать super
и только включать в себя те действия, которые меня волнуют.
Далее, в маршрутах вы можете указать значения по умолчанию Devise для контроллера выше. Вам не нужно это точно так, как показано ниже для devise_for
, только часть, ссылающаяся на controllers: { sessions: "sessions" }
MyPortfolio::Application.routes.draw do
devise_for :users, path_names: { sign_in: "login",
sign_out: "logout" },
controllers: { omniauth_callbacks: "omniauth_callbacks",
sessions: "sessions" }
resources :posts do
resources :comments
end
resources :projects do
resources :comments
end
resources :users
root :to => 'home#index'
get 'login' => 'devise/sessions#new'
get 'about_me' => 'about#index'
end
Возможно, это не самое СУЩЕСТВЕННОЕ решение, но это было единственное, что мне удалось придумать, чтобы указать перенаправление на страницу происхождения вместо корня или бесконечного цикла.