将变量从Devise控制器传递到自定义邮件程序?

时间:2019-08-16 10:44:14

标签: ruby-on-rails devise ruby-on-rails-5

我在我的Rails应用程序中使用Devise进行身份验证。

在我的registrations_controller中,我有一个像这样的变量:

class RegistrationsController < Devise::RegistrationsController
  def create
    foo = "bar"
    super
  end
end

然后在我的自定义邮件中,尝试访问foo变量。 opts参数似乎是值得关注的参数:

class CustomMailer < Devise::Mailer
  helper :application
  include Devise::Controllers::UrlHelpers

  def confirmation_instructions(record, token, opts={})
    Rails.logger.error opts[:foo].inspect
    super
  end
end

但是如何在不覆盖许多方法的情况下继续传递foo变量?

1 个答案:

答案 0 :(得分:0)

首先,阅读有关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 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

      ...
   end

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

即:

调用confirmation_instructions方法:

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

confirmation_instructions.html.erb

 <p> And then override the template according to you. <p>

希望这会对您有所帮助:)