Rails Resque外部模块中出现了未定义的方法错误。

8

我在resque worker中调用一个包含模块的方法时遇到了麻烦。在下面的示例中,当我尝试在worker(位于TestLib模块中)内调用say方法时,我一直收到未定义方法错误。我已经将代码简化到最基本的形式以说明问题:

控制器 (/app/controllers/test_controller.rb)

class TestController < ApplicationController
  def testque
    Resque.enqueue( TestWorker, "HI" )
  end
end

Library (/lib/test_lib.rb)

module TestLib
  def say( word )
    puts word
  end
end

Worker (/workers/test_worker.rb)

require 'test_lib'

class TestWorker
  include TestLib

  @queue = :test_queue

  def self.perform( word )
    say( word ) #returns: undefined method 'say' for TestWorker:Class
    TestLib::say( word ) #returns: undefined method 'say' for TestLib::Module
  end
end

Rakefile (resque.rake)

require "resque/tasks"
task "resque:setup" => :environment

我正在使用以下命令运行 resque:rake environment resque:work QUEUE='*'
所用的 Gem: rails(3.0.4) redis(2.2.2) redis-namespace(1.0.3) resque(1.19.0)
服务器: nginx/1.0.6
有人知道出现了什么问题吗?
1个回答

27

当你包含一个模块时,它的方法就变成了实例方法。当你扩展时,它们就变成了类方法。你只需要将 include TestLib 改为 extend TestLib,它就应该可以工作了。


“头撞墙” 我觉得最近我一直在用 Rails 工作。这就解决了问题。谢谢! - internetoutfitters
如果你尝试了这个方法但仍然无效,重新启动你的服务器。 - Kathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接