我正在使用Sorcery Gem我的 Rails 應用程式中的用戶身份驗證。一切正常。當用戶注冊時,我可以發送用戶激活電子郵件。但是發送電子郵件需要很長時間,所以我想延遲發送電子郵件或使用Sidekiq. 我閱讀了 Sorcery 檔案,但找不到使用 Sidekiq 延遲電子郵件的方法。
請指導我如何使用 Sidekiq 延遲 Sorcery gem 發送的電子郵件。
uj5u.com熱心網友回復:
對此可能有兩種方法:
- 在 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
PS:選項 1 不是一種干凈的方法,但如果您堅持使用 Sorcery 遺留配置,則可以使用
- 不要為 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.
uj5u.com熱心網友回復:
使用DelayedJob 集成中的片段
module Sorcery module Model module InstanceMethods def generic_send_email(method, mailer) config = sorcery_config mail = config.send(mailer).delay.send(config.send(method), self) end end end end
將此代碼添加到檔案底部:config/initializers/sorcery.rb.
添加
Sidekiq::Extensions.enable_delay!到config/initializers/sidekiq.rb.添加到
config/environments/test.rb.config.active_job.queue_adapter = :sidekiq config.action_mailer.perform_deliveries = true config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :test config.action_mailer.default_url_options = { :host => 'localhost:3000' }UserMailer來自用戶激活的方法示例def activation_needed_email(user) @user = user @url = activate_user_url(@user.activation_token) mail(to: user.email, subject: 'Activation') end添加到
spec/rails_helper.rb.require 'sidekiq/testing' Sidekiq::Testing.fake!撰寫測驗檢查它,必須通過。
require 'rails_helper' RSpec.describe UserMailer, type: :mailer do let(:user) { create(:user) } let(:mail) { described_class.activation_needed_email(user) } describe 'activation_needed_email' do it 'creates job in sidekiq' do expect do mail end.to change { Sidekiq::Worker.jobs.size }.by(1) end end end
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/411557.html
標籤:
