设计:重新发送确认电子邮件时,请更改Flash消息

时间:2012-10-15 22:13:49

标签: ruby-on-rails devise

我正在设置Devise,以便用户无需确认其电子邮件地址即可登录并使用该网站,类似于此question。但网站上有一些功能,除非用户确认,否则用户无法使用。

好的,没关系。我可以查看current_user.confirmed?。如果他们没有得到确认,我可以在页面上放一个按钮让他们请求再次发送确认。

我遇到的问题是,当他们在登录时执行此操作时,他们在结果页面上看到的Flash消息是“您已登录”。哪个不理想 - 我只想提出确认已发送的消息。

我开始尝试找出要覆盖的Devise::ConfirmationController的哪种方法以及什么,但我希望有人已经这样做了。

4 个答案:

答案 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