如何配置Devise使用自定义电子邮件布局?

40

当我说布局时,并不仅仅是指视图,因为这些视图都是我自己生成的。在我的所有邮件发送器中,我都使用默认布局,这个默认布局是我在SomeMailer.rb文件中定义的。

#some_mailer.rb
class SomeMailer < ActionMailer::Base
  layout 'sometemplate'

我是否可以用同样的方法来处理Devise Mailer及其他邮件发送功能?

4个回答

65

在 Devise 的 Github wiki 中找到了答案,

阅读它会有所帮助。;-)

config.to_prepare do
  Devise::Mailer.layout "simple" # simple.haml or simple.erb
  Devise::Mailer.helper :mailer
end

这里是维基页面的参考链接:如何创建自定义布局


12
或者,您可以在 setup 块之前,在 devise.rb 初始化器的顶部添加 Devise::Mailer.layout "simple"。这将更改 Devise 发送的电子邮件的布局。 - leppert
你能澄清一下 # email.haml 或 email.erb 是什么意思吗?你是不是想写 # simple.haml 或 simple.erb - John Bachir
已修复。(注释应为“#simple.haml或simple.erb”-它已从引用的Devise wiki中复制并粘贴,但仅自定义了字符串“simple”。) - djoll
2
请仅使用Devise :: Mailer.layout“ simple”。在后期gem版本中,config.to_prepare会引发错误。 - vladCovaliov
1
这个答案对于 Devise 3.5 仍然有效,但可能需要更多的信息。请注意,config.to_prepare 需要放在你的 application.rb 中,或者你可以在 devise.rb 中使用 Rails.application.config.to_prepare。链接提供了很多详细信息。 - stephen.hanson
@leppert,你的评论值得成为一个答案,甚至可能是一个最受欢迎和被接受的答案。 - mzrnsh

45

devise.rb中也有一个parent_mailer选项,假设你要在devise之外发送电子邮件,则默认情况下此选项设置为ActionMailer :: Base。但是,如果您已经有一个从ActionMailer :: Base继承的ApplicationMailer,则可以将parent_mailer更改为此选项,并获得所有预设的layoutsconfigurations

无论如何,如果您不想更改devise邮件控制器中的任何内容,使用此方法可以使应用程序中的Rails流程保持更整洁。

# devise.rb
config.parent_mailer = 'ApplicationMailer'

# application_mailer.rb
class ApplicationMailer < ActionMailer::Base
    layout 'mailer'
end

7
这是最佳答案。 - DaCart

20
# Devise::Mailer inherits from ActionMailer::Base other mail will work fine.

## app/mailers/deviser_mailer.rb

class DeviseMailer < Devise::Mailer
  layout 'email'
  default from: I18n.t("mailer.default.from")
end

## then in config/initializer/devise.rb

# Configure the class responsible to send e-mails.
config.mailer = "DeviseMailer"

更改过初始化程序后,请确保重新启动Rails服务器。


-3
尝试重新打开 Devise::Mailer 类:
 class Devise::Mailer < ActionMailer::Base
   layout 'sometemplate'
 end

没有起作用。我还尝试了几种不同的类变体,但它们都没有覆盖设备模板或非模板。 - holden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接