2011-12-22 45 views
11

UPDATE:有许多人针对此问题的补丁:https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798NoMethodError用的delayed_job(collectiveidea宝石)

更新2:对于任何运行到在Heroku这个问题而言,我发现降级到耙0.8。 7和使用延迟作业版本2.1.4工作,而延迟作业V3没有(虽然与补丁它在本地工作)。这是在Bamboo-mri-1.9.2堆栈上。

我想在本地的rails 3.1.0应用程序上实现delayed_job。我跑的迁移和 安装宝石文件:

gem 'delayed_job' 
gem 'delayed_job_active_record' 

继上collectiveidea github上(https://github.com/collectiveidea/delayed_job)的文档。我从我的控制器使得延迟电话如下:

EventMailer.delay.event_message_email(current_user, @event_message) 

这将导致任务被添加到工作表,但是当我运行耙作业:工作,它记录以下错误:

Class#event_message_email failed with NoMethodError: undefined method `event_message_email' for Class:Class - 6 failed attempts 

我已经看过其他的delayed_job NoMethod错误问题,但没有解决这个特定的错误或提供解决方案。 collectiveidea页面提到这种没有传递方法调用的格式对于如何设置Rails 3邮件程序是一种破解,所以我想知道这个文档是否可能有些过时,并且如果有一种新的方法称为邮件程序方法?

更新:也毫无延迟地调用邮件方法工作正常,我在默认的rails服务器上运行它,所以在collectiveidea faq中提到的Thin问题不适用。谢谢

+0

您最后一次重新启动“rake jobs:work”任务是什么时候?它需要在每次代码更改后重新启动。 – iwasrobbed 2011-12-22 16:56:38

+0

EventMailer.event_message_email(current_user,@event_message).delay.deliver是否有效? – Unixmonkey 2011-12-25 20:56:35

+0

@iWasRobbed:是的,我已经试过了 – tks 2011-12-27 02:14:24

回答

4

我通过切换到delayed_job(DJ)版本2.1.2解决了这个问题。

我使用: RVM 红宝石1.8.7(2010-01-10 PATCHLEVEL 249) 轨3.0.9

的Gemfile: 宝石 “的delayed_job”, '2.1.2'

在此之前我尝试使用最新版本的delayed_job的: 宝石“的delayed_job”:混帐=>“混帐://github.com/collectiveidea/delayed_job.git” 对我来说是v3.0.0.pre

但是: 导轨生成d elayed_job 未生成迁移文件。我手动创建它。然后在'rake db:migrate'之后,我得到了用于存储delayed_job队列的表。然后,当我想所有的东西都必须正确工作时,我也遇到了同样的错误。

当我试图找到此错误的来源时,在'delayed_jobs'表中,我发现delayed_job的任务被错误地保存。这里是“delayed_jobs”表从现场“处理程序”片段:

--- !ruby/object:Delayed::PerformableMailer 
object: !ruby/class Notifier 

据我所知,delayed_job的获得通过结构类的所有任务,做任务,应保存头isntead的'红宝石/结构! !红宝石/对象” 这是正确保存任务的片段:

--- !ruby/struct:Delayed::PerformableMailer 
object: !ruby/class Notifier 

要检查这个我停delaed_job过程中控制台。然后我打电话一些方法把DJ的任务是DB:

Notifier.delay.some_email(current_user, @event_message) 

然后我手动在“处理”场“!红宝石/结构”取代“红宝石/对象!”。 然后我开始了DJ'耙工作:工作',它说我邮件成功发送了。

但是: - 这项任务不能从DJ的桌子 删除 - 和邮件没有到达收件人

所以我决定,这是在delayed_job的新版本中的错误。我切换到DJ'2.1.2',这对我很好。

P.S:对不起,我的英语:)

+0

之前,感谢详细的评估,upvoted。我对表格字段进行了更改,并且还清除了作业,看起来您是正确的。我在github上将其作为一个问题打开,并将其添加为参考。我还没有尝试降级到2.1.2,因为我正在尝试一些其他的事情,我担心这不会解决与rails 3邮件程序相关的问题。 – tks 2011-12-27 02:43:26

+0

顺便问题是在https://github.com/collectiveidea/delayed_job/issues/323如果你想跟着它 – tks 2011-12-27 02:55:54

+1

Sukhoviy,嗨,试图走你的路线,但发现捆绑商不允许使用3.0.0.pre之前的delayed_job版本安装delayed_job_active_record。尝试使用delayed_job 2.1.2而不使用delayed_job_active_record似乎也不起作用。你能解决这个问题吗?或者我应该放下它并使用resque :)? – tks 2011-12-29 15:47:57

7

使用Mailer.delay.send_method似乎在Rails 3中(他们提到它在文档黑客攻击)越野车。我有相同的NoMethodError,并通过使用替代方法来创建文档中显示的作业,即使用执行方法创建新的Job类来解决它。

class UserMailerJob < Struct.new(:text, :email) 
    def perform 
    UserMailer.your_mailer_method(text, email).deliver 
    end 
end 

然后创建工作,在我的控制器:

Delayed::Job.enqueue UserMailerJob.new(@text, @email) 

它稍长做到这一点比使用延迟,但它似乎正确地创建工作和可靠地处理它们。

0

只是一个简短的说明。我遇到了这个问题,这是因为我将模型中的变量传递给了传递方法BEFORE_SAVE。切换到AFTER_CREATE解决了我的问题。

相关问题