如何让Sidekiq使用Mailboxer消息电子邮件?

时间:2014-06-23 23:15:42

标签: ruby-on-rails sidekiq ruby-on-rails-4.1 mailboxer

我正在使用Rails 4.1尝试使用Mailboxer Gem和Sidekiq,然后我按照文档中的文档和示例应用程序来设置所有内容。然后我在initializers/mailboxer.rb

中将邮件配置为使用UserMailer
config.notification_mailer = UserMailer
config.message_mailer = UserMailer

在发送或回复邮件时,网站上的所有内容和收到的电子邮件都可以正常运行。接下来,我尝试使用我从one of the issues on the Mailboxer github page获得的代码使用Sidekiq异步完成邮件作业。这也在初始化器中:

config.custom_deliver_proc = ->(mailer, mailable, recipient) do
  mailer.delay.send_email(mailable, recipient)
end

然而,现在当我发送消息时,它会击中Sidekiq,但它会抛出此错误:

ArgumentError: undefined class/module Mailboxer::Message

以下是user_mailer.rb中的相关代码:

def send_email(message, receiver)
  if message.conversation.messages.size > 1
    reply_message_email(message,receiver)
  else
    new_message_email(message,receiver)
  end
end

#Sends an email for indicating a new message for the receiver
def new_message_email(message,receiver)
  @message  = message
  @receiver = receiver
  set_subject(message)
  mail :to => receiver.send(Mailboxer.email_method, message),
     :subject => t('mailboxer.message_mailer.subject_new', :subject => @subject),
     :template_name => 'new_message_email'
end

#Sends and email for indicating a reply in an already created conversation
def reply_message_email(message,receiver)
  @message  = message
  @receiver = receiver
  set_subject(message)
  mail :to => receiver.send(Mailboxer.email_method, message),
     :subject => t('mailboxer.message_mailer.subject_reply', :subject => @subject),
     :template_name => 'reply_message_email'
end

我目前没有使用通知,因此我没有将其包括在内。它在哪里调用Mailboxer :: Message,它期望什么参数?这是一个Rails 4.1的东西吗?我仍然是Ruby / Rails的新手,对不起,如果这是我的一个明显错误。

我也尝试在UserMailer中的各个方法上调用delay,结果相同:

def send_email(message, receiver)
  if message.conversation.messages.size > 1
    UserMailer.delay.reply_message_email(message,receiver)
  else
    UserMailer.delay.new_message_email(message,receiver)
  end
end

2 个答案:

答案 0 :(得分:4)

它对我来说没有用。 delay没有mailer方法。看看这里:

>> RUBY_VERSION
=> "2.2.0"
>> Rails::VERSION::STRING
=> "4.2.1"

>> mailer.methods.include?(:delay)
=> false
>> mailer.send_email(mailable, recipient).methods.include?(:deliver_later)
=> true

所以,如果你使用Rails> 4.2使用此:

config.custom_deliver_proc = ->(mailer, mailable, recipient) do
  mailer.send_email(mailable, recipient).deliver_later
end

答案 1 :(得分:2)

更新:Rails 4.2及更高版本中的语法已更改。有关新语法,请参阅Tomasz's answer below


我们升级到Rails 4.1.4并且我再次尝试了相同的代码并且这次工作正常。我把

config.custom_deliver_proc = ->(mailer, mailable, recipient) do
  mailer.delay.send_email(mailable, recipient)
end

在初始化程序的 end ,不确定该展示位置是否有所作为。

我仍然不确定为什么相同的代码现在有效,之前没有,但我的理论是这是一个Rails 4.1.0问题,已通过4.1.4升级修复。希望这有助于其他人!