2011-07-07 12 views
5

私はdelayed_jobを使用してコントローラから関数を実行します。関数は、モジュールLIB/site_request.rbに格納されている:ruby​​ on rails:delayed_jobはモジュールの関数を実行しません

module SiteRequest 

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

end 

query_controller.rb:私はまた、両方が静かに実行していないモジュールからhandle_asynchronously句を削除し、delay.get_data(@query)を使用しよう

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 

(なしdelayed_job code works)

答えて

1

私は組み込みの遅延方法を自分自身で使用しようとしていました。私が自分のコーディングで決めたパターンは、DelayedJobsを自分自身にエンキューし、ペイロードオブジェクトを与えて動作させることでした。これはあなたのためにも機能するはずであり、さらに意味をなさないように見えます。 (この方法では、あなたも、たとえば、あなたのSiteRequestモジュールを必要としない場合があります。)

class MyModuleName < Struct.new(:query) 

    def perform 
    # TODO 
    end 

end 

をその後、代わりに保存した後get_data(query)を呼び出すのでは、とのエンキュー:

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

私は同じ問題を発見しました。私の環境は次のとおりです。2.1.7

  • のRails 4.2.6
  • activejob(4.2.6)
  • delayed_job(4.1.2)
  • delayed_job_active_record(4.1.1)

    1. ルビーMYソリューション: モジュールをクラスに変換します。 クラスからオブジェクトをインスタンス化し、そのメソッドをインスタンスに適用します。 ActiveJobはインスタンスのみをエンキューできます。あなたのケースでは :
    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 
    

    エンド

  • 関連する問題