4

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

好没问题。我可以检查一下current_user.confirmed?。如果他们没有被确认,我可以在页面上放一个按钮让他们请求再次发送确认。

我遇到的问题是,当他们在登录时执行此操作时,他们在结果页面上看到的闪存消息是“您已经登录”。这并不理想 - 我只想发布确认已发送的消息。

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

4

4 回答 4

7

flash 显示“您已经登录”的原因是因为用户被重定向到new_session_pathafter_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

将您的确认控制器添加到路由->

devise_for :users, :controllers => {:confirmations => 'users/confirmations' }
于 2012-10-22T16:35:21.273 回答
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
于 2012-10-18T05:42:00.170 回答
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
于 2013-09-13T18:29:05.677 回答
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."%>
于 2012-10-22T17:19:09.217 回答