我正在使用设计自定义邮件程序并使用我的新方法进行注册过程,但是当它在注册后尝试发送电子邮件时,我收到错误undefined local variable or method 'headers' for DeviseMailer:Class
。我需要能够指定SMTPAPI标头才能使用我的Sendgrid模板。我有一些其他邮件工作(没有设计相关),所以我采用相同的代码并将其添加到我的新设计邮件。
模型/ devise_mailer.rb
class DeviseMailer < Devise::Mailer
helper :application
include Devise::Controllers::UrlHelpers
default template_path: 'devise/mailer'
def self.confirmation_instructions(record, token, opts={})
new(:confirmation_instructions, record, token, opts)
headers "X-SMTPAPI" => {
"sub": {
"-user-" => [user.name]
},
"filters": {
"templates": {
"settings": {
"enable": 1,
"template_id": "f67a241a-b5af-46b3-9e9a-xxxxxxxxx"
}
}
}
}.to_json
mail(
to: user.email,
subject: "Confirm your account",
template_path: '../views/devise/mailer',
template_name: 'confirmation_instructions'
)
opts[:from] = 'support@mydomain.com'
opts[:reply_to] = 'support@mydomain.com'
opts[:to] = "myemail@mydomain.com" # just hardcoded right now, remove after testing
super
end
end
我在这里缺少什么?
答案 0 :(得分:1)
我相信headers
被定义为实例方法,而不是类方法。由于您试图在类的上下文中调用它(即self.confirmation_instructions
),因此未定义。
如果您在Devise wiki post中注意到使用自定义邮件程序,则说明会在实例上引用headers
,而不是类。
如果您只想添加一些自定义标头/选项,建议的方法是覆盖实例方法,然后调用super
。例如
class DeviseMailer < Devise::Mailer
helper :application
include Devise::Controllers::UrlHelpers
default template_path: 'devise/mailer'
def confirmation_instructions(record, token, opts={})
# custom header(s)
headers["X-SMTPAPI"]= {
"sub": {
"-user-" => [user.name]
},
"filters": {
"templates": {
"settings": {
"enable": 1,
"template_id": "f67a241a-b5af-46b3-9e9a-xxxxxxxxx"
}
}
}
}.to_json
# custom option(s)
opts[:from] = 'support@mydomain.com'
opts[:reply_to] = 'support@mydomain.com'
opts[:to] = "myemail@mydomain.com"
super
end
end
我建议阅读链接的博客文章,因为它讨论了更详细地覆盖邮件程序的默认行为。