Следующий рубиновый код для хранения предыдущего URL предназначен для исключения определенной серии, в которой конечное действие может отправить пользователя в бесконечный цикл.
def current_user_url # store last url
if (request.fullpath != "/users/sign_in?locale=*" &&
request.fullpath != "/users/sign_up?locale=*" &&
request.fullpath != "/users/password?locale=*" &&
request.fullpath != "/users/sign_out?locale=*" &&
request.fullpath != "/users?locale=*" &&
!request.xhr?) # don't store ajax calls
session[:previous_url] = request.fullpath
end
end
при обработке действий со ссылками на себя
def after_sign_in_path_for(resource)
session[:previous_url] || session[:confirm_url]
end
Подстановочный знак не работает должным образом, так как переменная сеанса хранит, например, /users/sign_in?locale=en
, несмотря на использование подстановочного знака. примечание: без использования ?locale=en
функция работает должным образом.
Как этот код может стать независимым от локали?
Обновление с примечанием о решении
В случае, если кто-то заскочит и взволнован вторым аплодисментом вики для драгоценного камня для разработки , вы не одиноки. Я не был слишком взволнован инстинктивно с фильтром после. Копаться в методе определения местоположения магазина в Devise можно, хотя и не так просто, как решение Макса ниже.
Это требует небольшой настройки, хотя (и [хм, да] вопрос не затрагивал devise) , где маршруты должны вызывать devise_for
, а контроллер должен наследовать от devise
devise_for :users, :controllers => { registrations: 'registrations', sessions: 'sessions' }
class SessionsController < Devise::SessionsController
skip_before_action :store_location
end
Мне кажется, это чище, время обслуживания ...