如何自定义Devise的"重发确认电子邮件"

Jen*_*ger 2 ruby-on-rails devise

我有一个自定义邮件程序(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
Run Code Online (Sandbox Code Playgroud)

(同样,UserMailer已设置好并且适用于欢迎电子邮件和重置密码电子邮件.)

但是什么不起作用是"重新发送确认指令"的选项.它使用默认的Devise样式发送,我希望它使用我的邮件程序布局的样式.我知道我可以手动将布局添加到默认的Devise布局,但我想保持DRY生效而不必这样做.

我试图重写send_confirmation_instructions方法找到这里,但我得到一个wrong number of arguments (1 for 0)错误create(gem) devise-2.2.3/app/controllers/devise/confirmations_controller.rb

7 # POST /resource/confirmation
8   def create
9     self.resource = resource_class.send_confirmation_instructions(resource_params)
Run Code Online (Sandbox Code Playgroud)

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

module Devise::Models::Confirmable::ClassMethods
  def send_confirmation_instructions
    UserMailer.send_confirmation_instructions(self).deliver
  end
end
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

jbn*_*unn 5

您不必通过该初始化程序来执行此操作.我通过覆盖确认控制器来完成此操作.我的设计路线如下:

devise_for :user, :path => '', :path_names => { :sign_in => 'login', :sign_out => 'logout', :sign_up => 'signup'}, 
:controllers => { 
  :sessions => "sessions", 
  :registrations => "registrations", 
  :confirmations => "confirmations"
}
Run Code Online (Sandbox Code Playgroud)

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

class ConfirmationsController < Devise::ConfirmationsController
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

<%= link_to 'Confirm your account', confirmation_url(@user, :confirmation_token => @user.confirmation_token) %>
Run Code Online (Sandbox Code Playgroud)