我正在使用Rails 4.1尝试使用Mailboxer Gem和Sidekiq,然后我按照文档中的文档和示例应用程序来设置所有内容。然后我在initializers/mailboxer.rb
:
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
答案 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升级修复。希望这有助于其他人!