我刚刚开始研究使用delayed_job gem。
为了测试它,我在欢迎电子邮件功能中添加了"延迟",并将该呼叫从更改为
UserMailer.welcome_email(self).deliver
至
UserMailer.delay.welcome_email(self)
这是在用户模型after_create中调用的。在函数执行后,我看到delayed_job表中显示了一个条目。现在,当我在命令行上运行"rake jobs:work"时,任务开始了,但给出了如下所示的错误
[Worker(host:Sanjay-PC pid:7008)] Starting job worker
[Worker(host:Sanjay-PC pid:7008)] Class#welcome_email failed with NoMethodError: undefined method `welcome_email' for #<Class:0x4871d60> - 0 failed attempts
[Worker(host:Sanjay-PC pid:7008)] 1 jobs processed at 0.0939 j/s, 1 failed ...
认为如果我将welcome_email方法声明更改为作为的Class方法
def self.welcome_email(user)
(前面加了self.)这可能会有所帮助。但是当我运行rake jobs:work时,我会得到以下错误
rake aborted!
undefined method `welcome_email' for class `UserMailer'
C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/core_ext/module/aliasing.rb:31:in `alias_method'
C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/core_ext/module/aliasing.rb:31:in `alias_method_chain'
C:/Ruby192/lib/ruby/gems/1.9.1/gems/delayed_job-2.1.4/lib/delayed/message_sending.rb:50:in `handle_asynchronously'
c:/mgn/mgn-r3/app/mailers/user_mailer.rb:10:in `<class:UserMailer>'
c:/mgn/mgn-r3/app/mailers/user_mailer.rb:1:in `<top (required)>'
C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/dependencies.rb:454:in `load'
<Stack truncated>
它现在似乎知道这个类是UserMailer,但不知何故,它看不到类方法welcome_email。
我在Rails 3.0.5、Ruby 1.9.2p180上,安装的delayed_job gem是2.1.4-在Windows 上
似乎在任何地方都找不到任何相关的答案。
谢谢你的想法。
-S
根据@pjammer的请求添加UserMailer代码
class UserMailer < ActionMailer::Base
default :from => "from@example.com"
def welcome_email(user)
@user = user
@url = "http://example.com/login"
mail(:to => user.email,
:subject => "Welcome to My Awesome Site")
end
end
只需使用此
UserMailer.delay.welcome_email(self).deliver
而不是
UserMailer.welcome_email(self).delay.deliver
我的解决方案是在处理程序类(对您来说是UserMailer类)中重新定义函数
def self.taguri
'tag:ruby.yaml.org,2002:class'
end
这是一个黑客攻击,我会试图找到一个更好的解决方案,但现在它对我有效。
(Rails 3.0.9,Ruby 1.9.2-p290,delayed_job 2.1.4)
https://groups.google.com/forum/?fromgroups=#!topic/delayed_job/gvIcbXrOaE解决了类方法的句柄同步错误。
根据上面链接中的Brandon Keeper,代码如下:
class ClassName
class << self
def foo
end
handle_asynchronously :foo
end
end
然后使用ClassName.delay.foo