【问题标题】:Send email before destroy User, Rails 5在销毁用户之前发送电子邮件,Rails 5
【发布时间】:2017-08-01 06:38:32
【问题描述】:

我正在尝试在我的用户对象被销毁之前挂钩一个邮件程序。

我正在使用 Sidekiq 发送电子邮件,但是当用户被销毁时会出现此错误。

ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find User with id [id]

在我的模型中,我有这个:

class User < ApplicationRecord
  before_destroy :goodbye_user

  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable

  private

  def send_devise_notification(notification, *args)
    devise_mailer.send(notification, self, *args).deliver_later
  end

  def goodbye_user
    GoodbyeUser.goodbye_user(self).deliver_later
  end

end

告别用户邮件永远不会发送。

有什么想法吗?

【问题讨论】:

  • 可以在用户注销账号时使用软删除策略,在邮件发送后进行硬删除

标签: ruby-on-rails email sidekiq rails-activejob


【解决方案1】:

这是因为您通过 deliver_later 异步发送电子邮件。由于它在一个单独的线程上,所以当工作人员获得工作时,用户已经被销毁了。

您可以同步发送电子邮件,也可以不使用before_destroy 回调。如果您想在后台发送电子邮件,只需调用您的 goodbye_user 方法并在那里销毁用户(在发送电子邮件后)。

【讨论】:

  • 好主意。另一个想法:只将您需要的用户数据传递给邮件程序 - 不要访问用户本身,因为它不再存在。
  • @MikePerham 如何将这些数据传递给邮件程序?请原谅我的菜鸟问题。
  • 这里有一个传递特定数据的例子:github.com/mperham/sidekiq/wiki/… 还请注意,您不应该将纯 Ruby 对象作为参数传递;使用可以序列化为 JSON 并返回的简单标量。
  • 正如@anothermh 所说,您可以使用current_user.as_json 之类的东西将用户对象作为散列传递。如果您需要附加其他数据,请查看as_json docs
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2017-04-19
  • 1970-01-01
  • 2019-10-29
  • 2015-10-01
相关资源
最近更新 更多