从Devise邮件程序方法中检索选项

时间:2015-08-18 20:57:40

标签: ruby-on-rails devise

我正在尝试将一些额外的信息传递给设计邮件程序方法。例如,我想传递用户是摄影师的信息......

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

1 个答案:

答案 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