1

私のresqueワーカークラスは次のとおりです。

require 'resque'
require 'resque/job_with_status'

class PatstatResqueWorker < Resque::JobWithStatus
  @queue = :my_worker_q
  def self.perform(query, label)
    puts "query:"
    puts options['query']
    puts "label:"
    puts options['label']
  end
end

そして、私がこれを resque と呼ぶコントローラー部分は...

class MyController < ApplicationController
  def resque
    job_id = PatstatResqueWorker.create(:query => @query, :label => "yes")
    status = Resque::Plugins::Status::Hash.get(job_id)
  end
end

そしてそれは機能しません:( resque関数からパラメーターを削除すると、引数の数が間違っています(0に対して2)と表示され、パラメーターセクションを追加すると、オプションが定義されていないと表示されます:(助けてもらえますか?

4

1 に答える 1

1

「オプションが定義されていません」というエラーが発生する理由は、optionsそれを使用するメソッドで定義していないためです。メソッドself.performは と の 2 つの異なる引数を受け取ることをquery期待labelしていますが、メソッド内のコードはoptionsハッシュを持っていることを期待しています。どちらかを選ばなければなりません。

次のいずれかを行います。

def self.perform(query, label)
  # use the parameters we've already defined
  puts "query:"
  puts query
  puts "label:"
  puts label
end

# call it like this
PatstatResqueWorker.create(@query, "yes")

または、次のようにします。

# change the method signature to match what you're doing
def self.perform(options)
  puts "query:"
  puts options['query']
  puts "label:"
  puts options['label']
end

# call it like this, with string keys
PatstatResqueWorker.create('query' => @query, 'label' => "yes")

ハッシュ バージョンでは、シンボルの代わりにハッシュ キーに文字列を使用するように呼び出しを変更したことに注意してください。必要に応じてシンボルを使用できますが、メソッドの本体でも変更する必要があります (つまりoptions[:query]、 の代わりにoptions['query'])。一貫性を保つ必要があります。

于 2013-06-11T13:39:39.433 に答える