0

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

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

随着版本 2.0.0 中对 ahoy_email 所做的更改,所有设置 ahoy_settings 的类方法都添加了一个 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属性并且它可以工作。before_actionafter_action

所以我的问题是:这是解决这个问题的正确方法吗?

因为这个 commit,从 3 年前开始,清楚地说:

保留禁用跟踪的旧方法

但是在文档中找不到它。

4

1 回答 1

0

对于遇到同样问题的任何人,我已经找到了解决方案,它包括两件事:

使用参数化的邮件程序并使用,和. 代码可以改写如下::iftrack_clickshas_historyutm_params

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

它会按预期工作。

于 2021-04-01T10:28:11.057 回答