禁用 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_clicks
、has_history
和 utm_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_clicks
、has_history
和 utm_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
它会按预期工作。
我最近从 1.1.1 升级到 ahoy_email 版本 2.0.3,并且我一直在重构我的代码以使用最新版本,但我遇到了一些问题我曾经拥有的一项功能。问题如下:
我希望能够禁用对某些已发送邮件的跟踪。
在 2.0.0 版中对 ahoy_email 进行了更改,所有设置 ahoy_settings 的 class 方法都添加了一个 before_action 来合并选项从三种方法中的一种设置,即 track_clicks
、has_history
和 utm_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_clicks
、has_history
和 utm_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
它会按预期工作。