启用可确认模块后,Devise将不允许未经证实的用户在预定义的时间段过后登录。而是将用户重定向回登录页面,并显示“您必须先确认帐户才能继续”。
这是一种不受欢迎的互动模式,因为闪存通知没有提供足够的空间来向用户正确解释访问被拒绝的原因,“确认您的帐户”的含义,提供重新发送确认的链接以及如何查看垃圾邮件文件夹等。
有没有办法可以更改此行为以重定向到特定的网址?
答案 0 :(得分:27)
抱歉,一开始我认为你的意思是注册后没有登录。因此,下面的内容适用于如何在注册后引导用户以及您需要为登录做什么就是创建自定义Devise :: FailureApp
然后在您的自定义FailureApp覆盖https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb中的redirect_url
方法:
def redirect_url
if warden_message == :unconfirmed
custom_redirect_path
else
super
end
end
注册后的自定义重定向:
在RegistrationsController中有一个控制器方法after_inactive_sign_up_path_for
,您可以覆盖它来实现此目的。
首先,在路线中,您需要指定使用自定义控制器:
config/routes.rb
:
devise_for :users, :controllers => { :registrations => "users/registrations" }
其次,您创建了一个继承自普通控制器的自定义控制器,以覆盖该方法:
app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
protected
def after_inactive_sign_up_path_for(resource)
signed_up_path
end
end
在这种情况下,对于我的应用程序,我的Devise模型是User,因此如果模型的名称不同,您可能希望更改该命名空间。我希望将我的用户重定向到signed_up_path
,但您可以将其更改为所需的路径。
答案 1 :(得分:9)
我刚刚做了这个,但采取了不同的方法。
app / controllers / sessions_controller.rb中的:
class SessionsController < Devise::SessionsController
before_filter :check_user_confirmation, only: :create
#
# other code here not relevant to the example
#
private
def check_user_confirmation
user = User.find_by_email(params[:email])
redirect_to new_confirmation_path(:user) unless user && user.confirmed?
end
end
这对我有用,似乎微创。在我的应用中,新会话始终必须通过sessions#create
,并且用户始终使用他们的电子邮件地址登录,因此这可能比您的更简单。
您当然可以在redirect_to
方法{@ 1}}中找到您想要的任何位置。 check_user_confirmation
对我来说是合乎逻辑的选择,因为它为用户提供了获得确认的资源。