2011-07-07 12 views
5

Chcę użyć delayed_job do wykonania funkcji z kontrolera. Funkcja ta jest przechowywana w module lib/site_request.rb:ruby ​​na szynach: delayed_job nie wykonuje funkcji z modułu

module SiteRequest 

    def get_data(query) 
    ... 
    end 
    handle_asynchronously :get_data 

end 

query_controller.rb:

class QueryController < ApplicationController 

    include SiteRequest 

    def index 
    @query = Query.find_or_initialize_by_word(params[:query]) 
    if @query.new_record? 
     @query.save 
     get_data(@query) 
     flash[:notice] = "Request for data is sent to server." 
    end 
    end 

end 

Próbowałem też usunąć handle_asynchronously klauzuli z modułu i używać delay.get_data(@query), zarówno nie wykonywane w trybie cichym (bez delayed_job działa)

Odpowiedz

1

Ja też miałem kłopot z wykorzystaniem wbudowanych metod opóźniających. Schemat, na którym opierałem się w moim własnym kodowaniu, polegał na tym, że osobiście umieściłem DelayedJobs, dając im ładunek, z którego mógłbym pracować. To powinno działać również dla ciebie i wydaje się mieć sens nawet. (W ten sposób, może nawet nie trzeba modułu SiteRequest, na przykład).

class MyModuleName < Struct.new(:query) 

    def perform 
    # TODO 
    end 

end 

Następnie, zamiast dzwonić get_data(query) Po zapisaniu Kolejkuj z:

Delayed::Job.enqueue(MyModuleName.new(query)) 
0

znalazłem ten sam problem. Moje środowisko jest:

  1. Ruby 2.1.7
  2. Rails 4.2.6
  3. activejob (4.2.6)
  4. delayed_job (4.1.2)
  5. delayed_job_active_record (4.1.1) MY rozwiązania: Zmień moduł w klasę. Wywołaj obiekt z klasy i zastosuj metodę do instancji. Wygląda na to, że ActiveJob może zamieniać tylko instancje. W twoim przypadku:
Class SiteRequest 
    def initialize 
    end 
    def get_data(query) 
    ... 
    end 
    handle_asynchronously :get_data 
end 
def index 
    ... 

    q= SiteRequest.new 
    q.get_data(@query) 
    flash[:notice] = "Request for data is sent to server." 
end 

koniec

Powiązane problemy