使用ActionMailer

时间:2015-12-11 22:05:35

标签: ruby-on-rails actionmailer

我最近发现了ActionMailer的after_action回调,它帮助清理了很多代码!我遇到的问题是在电子邮件呈现之后才会执行回调。这使得您无法实例化视图中使用的任何变量。

例如,假设我的邮件中的所有电子邮件都需要包含用户的取消订阅链接:

class BaseMailer < ActionMailer::Base

  def email1(user)
    @user = user
    include_unsubscribe_link
    ...
  end

  def email2(user)
    @user = user
    include_unsubscribe_link
    ...
  end

  #...more actions

  private

  def include_unsubscribe_link
    headers['List-Unsubscribe'] = @unsubscribe_link = @user.unsubscribe_link
  end
end

使用after_action清理它会很棒,但是在呈现视图后运行回调,因此视图无法访问实例变量。我不能使用before_action,因为实例变量尚未实例化,并且取决于操作的参数。

有什么方法可以干这个吗?

1 个答案:

答案 0 :(得分:0)

您可以使用default

来干掉它
class BaseMailer < ActionMailer::Base

  default 'List-Unsubscribe' => proc { @user.unsubscribe_link }

  def email1(user)
    @user = user
    ...
    mail
  end

  def email2(user)
    @user = user
    ...
    mail
  end

  #...more actions

default哈希允许使用proc,当你调用mail方法时将对其进行评估,这在你的情况下是完美的。我还建议不要将@unsubscribe_link指定为实例变量。由于您已经传递@user,因此它已完全过时,您与视图共享的实例变量越少越好,