2015-02-17 1 views
0

Я создаю рабочего для действия контроллера, но sidekiq не загружается из-за меня вызывающих параметров в методе perform. Любые идеи о том, как заставить это работать?Не могу передать параметры sidekiq

контроллер

def call_warrants_with_date_range 
    CallLogWorker.perform_async(params[:call_log]) 
    redirect_to call_logs_path, notice: 'Calls were successfully made.' 
end 

работник

class CallLogWorker 
    include Sidekiq::Worker 

    def perform(params[:call_log]) 
    client   = Twilio::REST::Client.new TWILIO_ACCOUNT_SID, TWILIO_ACCOUNT_AUTH_TOKEN 
    start_date   = params[:call_log][:warrant_start_date] 
    end_date   = params[:call_log][:warrant_end_date] 
    query = "SELECT people.id, warrants.warn_type, warrants.warn_date_issued, phone_numbers.phone_number 
    FROM people 
    LEFT OUTER JOIN warrants ON people.id = warrants.person_id 
    LEFT OUTER JOIN phone_numbers ON people.id = phone_numbers.person_id 
    WHERE warrants.warn_date_issued BETWEEN ? AND ? AND warrants.warn_type = 'AW'" 

    @numbers = CallLog.find_by_sql(["#{query}", start_date, end_date]) 
    @numbers.each do |dial| 
     begin 
     call = client.account.calls.create(
     :from => TWILIO_PHONE_NUMBER, 
     :to => dial.phone_number, 
     :url => 'http://twimlets.com/echo?Twiml=hello%20this%20is%20a%20test%20call%20please%20hang%20up&' 
    ) 

     CallLog.create!({ phone: dial.phone_number, status: call.status, 
     warrant_start_date: start_date, warrant_end_date: end_date, person_id: dial.id}) 
     Note.create!({ body: call.status, person_id: dial.id }) 
    rescue Exception => e 
     CallLog.create!({ phone: dial.phone_number, status: call.status, exception: e.to_s, 
     warrant_start_date: start_date, warrantend_date: end_date, person_id: dial.id}) 
     Note.create!({ body: e.to_s, person_id: dial.id }) 
    end 
    end 
end 
end 
+0

Я предлагаю вам прочитать [Как функции используют хэш-аргументы в Рубине] (HTTP : //stackoverflow.com/questions/16576477/how-do-functions-use-hash-arguments-in-ruby) –

+0

У вас нет доступа к параметрам внутри вашего рабочего ... Таким образом, вы должны передать их как аргумент метода perform_async. – Joel

ответ

6

В вашем работника:

def perform(params) 
    start_date   = params[:call_log][:warrant_start_date] 
    end_date   = params[:call_log][:warrant_end_date] 
    ...etc 
end 

, а затем в контроллере:

CallLogWorker.perform_async(params) 

Итак, вы анализируете параметры хэша в рабочий из контроллера, а затем ссылаетесь на него в своем работнике.

Обычно считается хорошей практикой хранить данные, которые вы передаете в рабочие места Sidekiq как можно меньше - see here для лучших практик. Таким образом, вы могли бы пойти дальше и иметь:

В вашем работнике:

def perform(start_date, end_date) 
    ...job content 
end 

И в контроллере:

CallLogWorker.perform_async(params[:call_log][:warrant_start_date], params[:call_log][:warrant_end_date])