我正在尝试配置Devise,以便每当用户未确认帐户登录时,他都会被重定向到new_confirmation_path
。
这是我到目前为止所得到的:
LIB / custom_failure.rb
class CustomFailure < Devise::FailureApp
def redirect_url
if warden_message == :unconfirmed
redirect_to new_user_confirmation_path(q: "unconfirmed")
else
super
end
end
def respond
if http_auth?
http_auth
else
redirect
end
end
end
配置/ application.rb中
config.autoload_paths << Rails.root.join('lib')
配置/初始化/ devise.rb
config.warden do |manager|
manager.failure_app = CustomFailure
end
不幸的是,每当用户尝试登录时,我都会收到以下错误:
AbstractController :: Users中的DoubleRenderError :: SessionsController #create
在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,每次操作最多一次。另请注意,重定向和渲染都不会终止执行操作,因此如果要在重定向后退出操作,则需要执行类似“redirect_to(...)并返回”的操作。
lib / custom_failure.rb中的错误(第15行附近)
我遵循了Devise Wiki Page
答案 0 :(得分:1)
如错误所述,您正在执行双重渲染(渲染或重定向)。我想这与你的redirect_url
方法直接相关。
查看devise's wiki,在覆盖redirect_url
方法时无需执行重定向。此外,通过检查devise's failure code,在失败的请求结束时,您的应用程序正在执行此操作:
redirect_to(redirect_url)
# Which is equal to
redirect_to(redirect_to(new_user_confirmation_path(q: "unconfirmed")))
哪个错了。要解决此问题,请在redirect_url
覆盖中仅指定网址而不是重定向:
class CustomFailure < Devise::FailureApp
def redirect_url
if warden_message == :unconfirmed
# Remove the `redirect_to` call
new_user_confirmation_path(q: "unconfirmed")
else
super
end
end
# ...
end