delayed_job: NoMethodError - PullRequest
       5

delayed_job: NoMethodError

1 голос
/ 25 октября 2011

Вот мой крошечный контроллер Rails3:

class HomeController < ApplicationController
  def index
    HomeController.delay.do_stuff
  end
  def self.do_stuff
    puts "Hello"
  end
end

При доступе к index задание корректно вставляется в базу данных:

--- !ruby/struct:Delayed::PerformableMethod 
object: !ruby/object:Class HomeController
method_name: :do_stuff

ПРОБЛЕМА: При выполнении bundle exec rake jobs:work я получаю:

Class#do_stuff failed with NoMethodError:
    undefined method `do_stuff' for #<Class:0x0000000465f910>

Несмотря на то, что HomeController.do_stuff работает отлично.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

См. https://github.com/collectiveidea/delayed_job/wiki/Common-problems#wiki-undefined_method_xxx_for_class в документации.

Кажется, у вас должно быть

..object: !ruby/class HomeController method_name ...

в базе данных, но у вас есть

..object: !ruby/object:Class HomeController method_name ...

вместо этого. Что плохо.

Даже автор delayed_job не знает причину. Это как-то зависит от веб-сервера, на котором вы работаете. Попробуйте рекомендацию вики.

0 голосов
/ 21 декабря 2012

В моем случае проблема была главным образом в том, что я передавал Hash в качестве параметра объекту, который был передан в очередь delayed_job.Но после 25 следов я пришел к выводу, что delayed_job принимает объекты только с целым числом в качестве параметра.Поэтому я сохранил все параметры в базе данных, а затем передал этот идентификатор записи в качестве параметра для delayed_job, и внутри функции выполнения мы можем получить доступ ко всем параметрам с этим идентификатором записи и удалить эту запись после извлечения этих данных.

Delayed::Job.enqueue LeadsJob.new(params[:customer]) # this job will be queued but will never run, this is because of the way Delayed_job serializes and De-serializes the objects.

вместо этого сделайте что-то вроде этого

@customer = Customer.create(params[:customer])
Delayed::Job.enqueue LeadsJob.new(@customer.id)

Если данные клиента состояли только в том, чтобы передать параметры, то удалите эту запись внутри функции.

Пожалуйста, пингуйте меня, если вам нужно больше информации ото же самое.

Возможно, проблема также в синтаксическом анализаторе YAML, который использует Delayed_Job, но я не пробовал эту опцию, упомянутую @Stefan Pettersson

0 голосов
/ 21 сентября 2012

У меня была такая же проблема.

Я обнаружил несколько обсуждений, в которых говорилось, что различные парсеры yaml использовались, когда задание было помещено в очередь веб-приложением и когда оно было выполнено позже.

Некоторые предполагают, что следует использовать псих-парсер. Некоторые предлагают сик. Сначала я попробовал психику, но в итоге столкнулся с проблемами несовместимости с другими драгоценными камнями. Поэтому я выбрал сик.

Мне не удалось разобраться, какие файлы конфигурации используются веб-сервером и очередью. После долгих экспериментов я получил следующие конфигурации (все они в верхней части файла):

#application.rb
require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'yaml'
YAML::ENGINE.yamler= 'syck'
# ...

и

#environment.rb
require 'yaml'
YAML::ENGINE.yamler= 'syck'
# ...

и

#boot.rb
require 'yaml' 
YAML::ENGINE.yamler= 'syck' 
require 'rubygems'
# ...

Я использую Ruby 1.9.3, Rails 3.2.8, Webrick, delayed_job 3.0.3

...