【问题标题】:How to use Sorcery Gem with Sidekiq如何在 Sidekiq 中使用魔法宝石
【发布时间】:2022-01-17 22:15:03
【问题描述】:

我正在使用Sorcery Gem 在我的 Rails 应用程序中验证用户。一切正常。当用户注册时,我可以发送用户激活电子邮件。但是发送电子邮件需要很长时间,所以我想延迟发送电子邮件或使用Sidekiq 在后台发送电子邮件。我阅读了 Sorcery 文档,但找不到使用 Sidekiq 延迟发送电子邮件的方法。

请指导我如何使用 Sidekiq 延迟 Sorcery gem 发送的电子邮件。

【问题讨论】:

  • 假设您启用了 Sidekiq (.delay),是否会在邮件程序上调用延迟帮助?
  • @Abhinay Sorcery 自动发送电子邮件,所以我不知道在哪里将 .delay 放在代码中。
  • 我从文档中了解到,您可以将其配置为调用任何 Mailer。您可以在该方法中执行的操作是调用 MailerJob.perform_late(*arg) 而不是立即调用 mail(*args)
  • 另一种更简洁的方法可能是根本不通过巫术设置邮件。您可以在此页面 (github.com/Sorcery/sorcery/wiki/User-Activation) 上恢复为 UserMailer 提到的更改,并根据您何时要触发电子邮件在 User 模型上添加回调,这样您就可以控制要调用的内容以及是否使用 sidekiq。

标签: ruby-on-rails sidekiq sorcery


【解决方案1】:

可能有两种方法:

  1. 在 Mailer 中调用 Sidekiq 工作人员
what I understand from the docs is that you can configure it to call any
Mailer. What you could do inside the method is call 
MailerJob.perform_late(*arg) instead of calling mail(*args) right away

假设你有这样的代码(参考:https://github.com/Sorcery/sorcery/wiki/User-Activation

# app/mailers/user_mailer.rb
def activation_needed_email(user)
  @user = user
  @url  = activate_user_url(@user.activation_token)
  mail(to: user.email, subject: 'Welcome to My Awesome Site')
end

你可以把代码改成这样

# app/mailers/user_mailer.rb
def activation_needed_email(user)
  @user = user
  @url  = activate_user_url(@user.activation_token)
  # mail(to: user.email, subject: 'Welcome to My Awesome Site')
  MyMailerWorker.perfor_later(to: user.email, subject: 'Welcome to My Awesome Site')
end

您的工作人员将根据 sidekiq 文档进行定义(参考:https://github.com/mperham/sidekiq/wiki/Getting-Started

class MyMailerWorker
  include Sidekiq::Worker

  def perform(to: nil, subject: nil)
    MailerIWantToCall.send_activation_email(to, subject)
  end
end

P.S:选项 1 不是一种干净的方法,但如果您坚持使用 Sorcery 遗留配置,则可以使用

  1. 不要为 srcoery 设置邮件设置(更简洁的方法)
Do not setup mail through sorcery at all.You can revert the changes 
mentioned for UserMailer on this page
(github.com/Sorcery/sorcery/wiki/User-Activation) and add a callback on User 
model based on when do you want to trigger an email and that way you have 
control over what to call and with sidekiq or not. 

【讨论】:

  • 请解释如何Call Sidekiq worker inside Mailer。我不明白我必须为您的解决方案 1 做些什么。
  • 我会在答案中添加详细信息。
【解决方案2】:

我找到了解决方案。这很容易。我们只需要在sorcery.rb文件中添加以下行,所有的巫术邮件都将由ActiveJob处理

user.email_delivery_method = :deliver_later

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多