我正在尝试将一些额外的信息传递给设计邮件程序方法。例如,我想传递用户是摄影师的信息......
MyDeviseMailer.confirmation_instructions(@user, nil, photographer: true )
我无法检索该信息。我使用opts尝试了以下内容
def confirmation_instructions(record, token, opts={})
@token = token
@user = record
@is_photographer = opts[:photographer]
devise_mail(record, :confirmation_instructions, opts)
end
答案 0 :(得分:0)
你走在正确的道路上。
我添加了一个简化和一个改进:
super
将其余工作委托给设计原始实现opts#delete
来避免在电子邮件标题上自动设置opts值(默认情况下会设置)。 app/mailers/my_devise_mailer.rb
class MyDeviseMailer < Devise::Mailer
helper :application # gives access to all helpers defined within `application_helper`.
include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`
default template_path: 'devise/mailer' # to make sure that your mailer uses the devise views
def confirmation_instructions(record, token, opts={})
@is_photographer = opts.delete(:photographer)
super
end
end
现在,视图可以使用@is_photographer
。
app/views/devise/mailer/confirmation_instructions.html.erb
<% if @is_photographer %>
<p>Welcome photographer <%= @email %>!</p>
<% else %>
<p>Welcome <%= @email %>!</p>
<% end %>
或许,更简单的替代方法是避免一起创建MyDeviseMailer
所有内容,只需将is_photographer?
作为属性读取器或方法直接放在User
上,然后在设计邮件模板中使用它@resource。
app/models/user.rb
class User
...
def is_photographer?
...
end
# or
attr_reader :is_photographer?
# or
attr_accessor :is_photographer?
end
app/views/devise/mailer/confirmation_instructions.html.erb
<% if @resource.is_photographer? %>
<p>Welcome photographer <%= @email %>!</p>
<% else %>
<p>Welcome <%= @email %>!</p>
<% end %>
此外,此选项使您能够轻松地在User
上添加额外的属性或方法,并将其信息包含在邮件程序模板中,前提是它们真正属于User
模型。对于不属于的属性,自定义您自己的MyDeviseMailer
的第一个选项将有所帮助。如果存在用户归属和非用户归属属性的混合,则可以组合这两个选项。
我希望这能回答你的问题。如果您需要进一步的帮助或对此有任何疑问,请与我们联系。
Andy Maleh