【问题标题】:How can I customize Devise's "resend confirmation email"如何自定义 Devise 的“重新发送确认邮件”
【发布时间】:2013-05-08 10:39:53
【问题描述】:

我有一个自定义邮件程序 (UserMailer.rb) 和一些方法来覆盖欢迎电子邮件和忘记密码电子邮件的默认设计方法。邮件程序使用自定义模板来设置电子邮件的样式——而且效果很好。

config/initializers,我有一个文件

module Devise::Models::Confirmable
    # Override Devise's own method. This one is called only on user creation, not on subsequent address modifications.

  def send_on_create_confirmation_instructions
    UserMailer.welcome_email(self).deliver
  end

  ...
end

(同样,UserMailer 已设置好,非常适用于欢迎电子邮件和重置密码电子邮件。)

但是“重新发送确认说明”选项不起作用。它使用默认的设计样式发送,我希望它使用我的邮件布局的样式。我知道我可以手动将布局添加到默认的 Devise 布局,但我想保持 DRY 有效,而不必这样做。

我已尝试覆盖 send_confirmation_instructions 方法 found here,但在 create(gem) devise-2.2.3/app/controllers/devise/confirmations_controller.rb 处出现 wrong number of arguments (1 for 0) 错误

7 # POST /resource/confirmation
8   def create
9     self.resource = resource_class.send_confirmation_instructions(resource_params)

在我的初始化程序文件中,我可以通过为 Devise 添加新的覆盖来解决此错误,但我可能没有正确执行此操作:

module Devise::Models::Confirmable::ClassMethods
  def send_confirmation_instructions
    UserMailer.send_confirmation_instructions(self).deliver
  end
end

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    您不必通过该初始化程序来执行此操作。我通过覆盖确认控制器来做到这一点。我的设计路线如下:

    devise_for :user, :path => '', :path_names => { :sign_in => 'login', :sign_out => 'logout', :sign_up => 'signup'}, 
    :controllers => { 
      :sessions => "sessions", 
      :registrations => "registrations", 
      :confirmations => "confirmations"
    }
    

    然后,创建confirmations_controller 并扩展 Devise::ConfirmationsController 以覆盖:

    class ConfirmationsController < Devise::ConfirmationsController
    

    在那个控制器中,我有一个创建方法来覆盖默认值:

    def create
    
      @user = User.where(:email => params[:user][:email]).first
    
      if @user && @user.confirmed_at.nil?
        UserMailer.confirmation_instructions(@user).deliver
        flash[:notice] = "Set a notice if you want"
        redirect_to root_url
      else
        # ... error messaging or actions here
      end
    
    end
    

    显然,在 UserMailer 中,您可以指定用于显示确认消息的 html/文本模板。 confirmation_token 应该是 @user 模型的一部分,您可以使用它来创建具有正确令牌的 URL:

    <%= link_to 'Confirm your account', confirmation_url(@user, :confirmation_token => @user.confirmation_token) %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2015-08-18
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多