当我重温 /users/sign_in
已经登录后,我看到了闪光 You are already signed in.
以及我的日志中的以下内容..
Filter chain halted as :require_no_authentication rendered or redirected
..然后我被重定向到
/
.我想根据某些条件调用回调和重定向。这在精神上类似于
after_sign_up_path_for
除了它更像是“在已经登录的情况下尝试登录后”。
最佳答案
现在,没有简单的方法来完成你想要的。 (也许拉取请求是有序的。)
问题是when the user is already authenticated , Devise 调用 after_sign_in_path_for
方法。
这个方法也是在用户正常登录的时候调用的,所以即使你重写了这个方法,也无法区分刚刚登录的用户和已经登录的用户。
唯一的解决方案是扩展/覆盖 Devise 的 SessionsController:
class SessionsController < Devise::SessionsController
private
def require_no_authentication
assert_is_devise_resource!
return unless is_navigational_format?
no_input = devise_mapping.no_input_strategies
authenticated = if no_input.present?
args = no_input.dup.push scope: resource_name
warden.authenticate?(*args)
else
warden.authenticated?(resource_name)
end
if authenticated && resource = warden.user(resource_name)
flash[:alert] = I18n.t("devise.failure.already_authenticated")
redirect_to YOUR_PATH_HERE
end
end
end
由于此 Controller 继承自 Devise 的 Controller ,因此当您的 Controller 中未定义操作时,该操作将由 Devise 的 Controller 处理。所以你只需要覆盖
require_no_authentication
方法,其中 is called in a before_filter .最后,编辑您的路由文件以使此更改生效:
# routes.rb
devise_for :users, :controllers => { :sessions => 'sessions' }
关于ruby-on-rails - "You are already signed in."是否有设计回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22371512/