禁用 rails ahoy_email 的跟踪

Disable tracking for rails ahoy_email

我最近从 1.1.1 升级到 ahoy_email 版本 2.0.3,并且我一直在重构我的代码以使用最新版本,但我遇到了一些问题我曾经拥有的一项功能。问题如下:

我希望能够禁用对某些已发送邮件的跟踪。

在 2.0.0 版中对 ahoy_email 进行了更改,所有设置 ahoy_settings 的 class 方法都添加了一个 before_action 来合并选项从三种方法中的一种设置,即 track_clickshas_historyutm_params,因此由于选项仅在 before_action 中合并,我无法执行以下操作:

class DigestMailer < ActionMailer::Base
  has_history user: -> { @recipient }, extra: -> { {digest_message_id: @digest_message.id} }
  track_clicks campaign: "digest"

  def digest(digest_message, user, **options)
    @recipient = user
    @digest_message = digest_message
    self.class.has_history options
    ....
  end
end

DigestMailer.digest(DigestMessage.first, User.first, click: false, message: false).deliver_now

我在摘要操作中设置的选项实际上不会合并,因为它们应该在调用 digest 操作之前合并

我能做的如下:


class DigestMailer < ActionMailer::Base
  has_history user: -> { @recipient }, extra: -> { {digest_message_id: @digest_message.id} }
  track_clicks campaign: "digest"

  def digest digest_message, user, **options
    @recipient = user
    @digest_message = digest_message
    self.ahoy_options = AhoyEmail.default_options.merge(options)
  end
end

DigestMailer.digest(DigestMessage.first, User.first, click: false, message: false).deliver_now

这有效,因为我覆盖了 ahoy_options 属性 after before_action 回调被调用并且 before after_action 回调被调用并且有效。

所以我的问题是:这样做是否正确?

因为this commit,从3年前,就明确的说:

Keep old method of disabling tracking

但是在文档中找不到它。

对于遇到同样问题的任何人,我已经找到了解决方案,它由两部分组成:

使用 parametrized mailer 并使用 track_clickshas_historyutm_params:if 选项。代码可以重写如下:

class DigestMailer < ActionMailer::Base
  has_history(
    user: -> { params[:recipient] },
    extra: -> { {digest_message_id: params[:digest_message].id} },
    if: -> { params[:options].try(:fetch, :message) != false }
  )

  track_clicks(
    campaign: "digest",
    if: -> { params[:options].try(:fetch, :track_clicks) != false }
  )

  def digest
    recipient = params[:recipient]
    digest_message = params[:digest_message]

    Rails.logger.info "Sending digest to #{recipient} with email #{recipient.data.email}"
    internal_send_digest_message(digest_message.title)
  end
end

DigestMailer.with(digest_message:DigestMessage.first, recipient: User.first, options: {track_clicks: false, message: false}).deliver_now

它会按预期工作。