Rails Resque неопределенная ошибка метода во внешнем модуле - PullRequest
8 голосов
/ 15 ноября 2011

У меня проблемы с вызовом методов из включенного модуля внутри работника resque.В приведенном ниже примере я получаю неопределенные ошибки метода, когда пытаюсь вызвать метод say внутри работника (который находится в модуле TestLib).Я сократил код до простых основ, чтобы проиллюстрировать проблему:

Контроллер (/app/controllers/test_controller.rb)

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

Библиотека (/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='*'

Gems: rails (3.0.4) redis (2.2.2) redis-namespace (1.0.3) resque (1.19.0)

Сервер: nginx / 1.0.6

У кого-нибудь есть идеи относительно того, что там происходит?

1 Ответ

27 голосов
/ 15 ноября 2011

Когда вы включаете модуль, его методы становятся методами экземпляра. Когда вы расширяете, они становятся методами класса. Вам просто нужно изменить include TestLib на extend TestLib, и оно должно работать.

...