我正在设置Devise,以便用户无需确认其电子邮件地址即可登录并使用该网站,类似于此question。但网站上有一些功能,除非用户确认,否则用户无法使用。
好的,没关系。我可以查看current_user.confirmed?
。如果他们没有得到确认,我可以在页面上放一个按钮让他们请求再次发送确认。
我遇到的问题是,当他们在登录时执行此操作时,他们在结果页面上看到的Flash消息是“您已登录”。哪个不理想 - 我只想提出确认已发送的消息。
我开始尝试找出要覆盖的Devise::ConfirmationController
的哪种方法以及什么,但我希望有人已经这样做了。
答案 0 :(得分:6)
Flash说“您已登录”的原因是因为用户被new_session_path
方法重定向到after_resending_confirmation_instructions_path_for
。我会覆盖此方法以检查它们是否已登录。如果是,则不要重定向到new_session_path
,设置您的Flash消息并重定向到另一个页面。
将确认控制器置于controllers/users/confirmations_controller.rb
class Users::ConfirmationsController < Devise::ConfirmationsController
protected
def after_resending_confirmation_instructions_path_for(resource_name)
if signed_in?
flash[:notice] = "New message here" #this is optional since devise already sets the flash message
root_path
else
new_session_path(resource_name)
end
end
end
将您的confirmationsController添加到routes-&gt;
devise_for :users, :controllers => {:confirmations => 'users/confirmations' }
答案 1 :(得分:1)
我认为它应该是这样的:
module Devise
module ConfirmationsController
extend ActiveSupport::Concern
included do
alias_method_chain :show, :new_flash
end
def show_with_new_flash
# do some stuff
flash[:notice] = "New message goes here"
end
end
end
答案 2 :(得分:0)
可以编辑
config / locales / devise.en.yml在行上更加相关:
failure:
already_authenticated: 'You are already signed in.'
或者您可以在添加了Flash消息的视图中执行此操作
<%=content_tag :div, msg, id: "flash_#{name}" unless msg.blank? or msg == "You are already signed in."%>
答案 3 :(得分:0)
我正在使用Devise 3.1.0,这个场景有一种不同的方法,而不是在最高投票答案中描述的after_resending_confirmation_instructions_path_for。我修改了我的样子:
class Users::ConfirmationsController < Devise::ConfirmationsController
protected
def after_confirmation_path_for(resource_name, resource)
if signed_in?
set_flash_message(:notice, :confirmed)
root_path
elsif Devise.allow_insecure_sign_in_after_confirmation
after_sign_in_path_for(resource)
else
new_session_path(resource_name)
end
end
end