问题 带有delayed_job的noMethodError(collectiveidea gem)


更新:这个问题有一个补丁: https://github.com/collectiveidea/delayed_job/commit/023444424166ba2ce011bfe2d47954e79edf6798

更新2:对于在Heroku专门遇到此问题的任何人,我发现降级为Rake 0.8.7并使用延迟作业版本2.1.4工作,而延迟作业v3没有(虽然补丁它确实在本地工作) 。这是在Bamboo-mri-1.9.2堆栈上。

我试图在本地的rails 3.1.0应用程序上实现delayed_job。我运行了迁移 安装了gem文件:

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)

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

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

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

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


10761
2017-12-22 09:59


起源

你最后一次重新启动时间是什么时候 rake jobs:work 任务?每次代码更改后都需要重新启动。 - iwasrobbed
EventMailer.event_message_email(current_user,@ event_message).delay.deliver有效吗? - Unixmonkey
@iWasRobbed:是的,我试过了 - tks
@Unixmonkey不,这不起作用,实际上它提供了一个有用的错误,说延迟应放在方法调用之前 - tks


答案:


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

我在用: RVM ruby 1.8.7(2010-01-10 patchlevel 249) rails 3.0.9

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

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

但:    rails生成delayed_job 没有生成迁移文件。我是手动创建的。然后在'rake db:migrate'之后我得到了用于存储delayed_job队列的表。然后,当我认为一切都必须正常工作时,我也有同样的错误。

当我试图找到这个错误的来源时,在'delayed_jobs'表中我发现delayed_job的任务被错误地保存了。以下是'delayed_jobs'表中字段'handler'的片段:

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

据我所知,delayed_job通过Struct类获取所有任务,因此任务应该用'!ruby / struct'标题保存,而不是'!ruby / object' 以下是正确保存任务的片段:

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

为了检查这一点,我在控制台中停止了delaed_job进程。然后我调用了一些方法将DJ的任务放到DB:

Notifier.delay.some_email(current_user, @event_message)

然后我在'handler'字段中手动将'!ruby / object'替换为'!ruby / struct'。 然后我开始DJ'佣金工作:工作',它说我邮件已成功发送。

但: - 这个任务没有从DJ的桌子上删除 - 邮件没有收到收件人

所以我认为这是新版本delayed_job中的一个错误。我改用DJ'2.1.2',这对我很好。

P.S。:抱歉我的英文:)


4
2017-12-25 14:18



嗨,感谢您的详细评估,upvoted。我对表字段进行了更改,它也清除了作业,因此看起来你是正确的。我在github上打开了这个问题,并将其作为参考添加。我还没有尝试降级到2.1.2,因为我正在尝试其他一些事情,我担心这不会解决与rails 3邮件程序相关的问题。 - tks
顺便问一下这个问题 github.com/collectiveidea/delayed_job/issues/323 如果你想跟随它 - tks
Sukhoviy,嗨,试图走你的路线,但发现捆绑商不允许在3.0.0.pre之前安装delayed_job_active_record版本的delayed_job。尝试使用delayed_job 2.1.2而不使用delayed_job_active_record似乎也不起作用。你有能力解决这个问题吗?或者我应该放弃它并使用resque :)? - tks
Sukhoviy,哎呀,没关系2.1.2工作正常没有delayed_job_active_record,只是忘了更新gem文件 - tks


在Rails 3中使用Mailer.delay.send_method似乎有些错误(他们提到它是文档中的黑客)。我有相同的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)

这比使用延迟稍微长一点,但它似乎正确地创建了作业并可靠地处理它们。


7
2018-01-06 18:55





快速说明一下。我有这个问题,因为我将模型中的变量传递给交付方法BEFORE_SAVE。切换到AFTER_CREATE为我解决了问题。


0
2018-01-08 22:09