以重置密码发送的邮件为例:
devise发送邮件的模板在:[项目]/app/views/devise/mailer/reset_password_instructions.html.erb
如果此路径下不存在对应的模板则会去默认路径找
默认路径是/usr/local/rvm/gems/ruby-2.3.3/gems/[devise版本]/app/views/devise/mailer/reset_password_instructions.html.erb
Devise版本处以具体环境为准(在发送邮件时的控制台可以看到准备渲染的模板路径信息)
如果默认路径还是没有reset_password_instructions的话就会产生Template is missing错误,Devise的模板名称是被事先约定的,改变模板名称也会导致找不到模板,如果想自定义邮件模板名称必须重写Devise邮件发送相关的方法
如图,修改/usr/local/rvm/gems/ruby-2.3.3/gems/[devise版本]/app/mailers/devise/mailer.rb以后,Devise将会在两种路径中寻找reset_password_instructions_zh.html.erb,默认的模板名将无法找到。
除了在gem里面修改还有一种更好的方法:在[项目]/app/mailers新建devise文件夹,然后新建mailer.rb在这里重写mailer.rb,之后rails会自动到这里寻找Devise::Mailer,这样避免了对gem的修改。
如果不想重写mailer.rb,可以新建my_mailer.rb,然后在其中继承Devise::Mailer:
# [项目]/app/mailers/devise/my_mailer.rb
class Devise::MyMailer < Devise::Mailer
xxxx
end
然后在devise.rb配置config.mailer = "Devise::MyMailer"
。可参考这里