delayed_job: NoMethodError

Вот мой крошечный контроллер 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 работает отлично. Есть идеи?


person Nicolas Raoul    schedule 25.10.2011    source источник


Ответы (3)


См. 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 не знает причины. Это как-то зависит от веб-сервера, на котором вы работаете. Попробуйте рекомендации вики.

person Petr    schedule 25.10.2011
comment
Действительно, запуск rails server вместо сервера моей IDE решил проблему, большое спасибо! - person Nicolas Raoul; 25.10.2011
comment
Ваш ответ также решает мой вопрос о вознаграждении: stackoverflow.com/questions/7845874 Опубликуйте ответ там (например, просто со ссылкой на здесь) и я награжу тебя наградой :-) - person Nicolas Raoul; 27.10.2011
comment
Я использовал RubyMine IDE для запуска своей консоли. Остановка этого и запуск rails в окне терминала на моем Mac устранили эту проблему. - person Stone; 25.03.2012

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

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

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

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

#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.

person Stefan Pettersson    schedule 21.09.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.

person Peru    schedule 20.12.2012