如何传递实例变量来设计Rails中的自定义邮件程序?

时间:2017-11-08 16:27:15

标签: ruby-on-rails session devise mailer

我通过覆盖设计邮件来使用自定义邮件程序。它工作正常。但我需要将一些数据传递给邮件程序模板,以便在确认电子邮件发送给用户时它包含一些动态内容。我已经尝试使用session,@ resource和current_user方法,但两者都无法正常工作。有没有办法做到这一点? 自定义邮件

class CustomMailer < 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 you mailer uses the devise views

  def confirmation_instructions(record, token, opts={})
      opts[:subject] = "Email Confirmation"
      opts[:from] = 'no-reply@abc.com'
      @data = opts[:custom_field]
    super
  end

end
控制器中的

CustomMailer.confirmation_instructions(token, {custom_field: "abc"})

这是模板中的代码

We are happy to invite you as user of the <b>  <%= @data %> </b> 

感谢。

1 个答案:

答案 0 :(得分:2)

首先,请阅读Devise custom mailer以熟悉此过程。

简单地说,这就是你要做的事情:

config / initializers / devise.rb 中的

config.mailer = "DeviseMailer"

现在,您只需像项目中的任何其他邮件一样使用DeviseMailer

    class DeviseMailer < 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 invite(sender, recipient)
      @sender = sender
      @recipient = recipient

      mail( :to => recipient.email,
          :subject => "Invite by #{sender.name}"
        )
    end
      ...
   end

您现在可以调用项目中的invite并传递您希望能够在模板中访问的任何变量。

即:

调用invite方法:

DeviseMailer.invite(current_user, newContact).deliver

因此,在您的视图中,您可以调用变量:

invite.html.erb

<p>Hello <%= @recipient.email %></p>

<% if @sender.email? %>
  <p> some additional welcome text here from <%= @sender.email %> </p>
<% end %>

修改

在这里回答您的具体问题是您要覆盖的内容:

def confirmation_instructions(record, token, opts={})
  headers["Custom-header"] = "Bar"
  opts[:from] = 'my_custom_from@domain.com'
  opts[:reply_to] = 'my_custom_from@domain.com'
  super
end

然后在任何地方调用它:

 DeviseMailer.confirmation_instructions(User.first, "faketoken", {})