【问题标题】:Using after_action callback for ActionMailer对 ActionMailer 使用 after_action 回调
【发布时间】:2015-12-11 22:05:34
【问题描述】:

我最近发现了 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,因为实例变量尚未实例化并且取决于操作的参数。

有什么办法可以把它弄干?

【问题讨论】:

    标签: ruby-on-rails actionmailer


    【解决方案1】:

    您可以使用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 hash 允许使用 proc,当您调用 mail 方法时将对其进行评估,这在您的情况下是完美的。我还建议不要将 @unsubscribe_link 分配为实例变量。由于您已经传递了@user,因此它已完全过时,您与视图共享的实例变量越少越好,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多