2017-11-20 4 views
1
Rails 5.1 

Ich habe folgendes in meinem gemfileverzögert Job Unter Verwendung eines Verfahrens im Hintergrund habe ich zu verarbeiten

gem 'delayed_job' 
gem 'delayed_job_active_record' 
gem 'daemons' 

ich installiert/aktualisiert die Edelsteine ​​

Dann:

rails generate delayed_job:active_record 

Dies erzeugte zwei Dateien im Bin namens delayed_jobs.rb und erstellte die Migrationsdateien.

I hinzugefügt folgend config/application.rb:

config.active_job.queue_adapter = :delayed_job 

Ich habe einen Controller, mit einer Aktion, die eine bereits hochgeladen CSV-Datei erfolgt, parst sie, und füllt die DB mit den Daten. Ich möchte, dass diese Methode oder speziell ein Teil dieser Methode im Hintergrund verarbeitet wird.

Die Methode ist:

def process_parsed_spreadsheet 
    temp_file_path = params[:temp_file_path] 
    @spreadsheet = helpers.open_worksheet(temp_file_path) 
    number_of_rows = @spreadsheet.count - 1 

    helpers.process_spreadsheet(number_of_rows, @spreadsheet, params[:followed_id]) 
    helpers.remove_uploaded_file(temp_file_path) 

    redirect_to root_path, notice: t('fw_exports.file_successfully_processed') 
end 

Ich bin verloren, wie delayed_jobs verwenden diese Methode im Hintergrund zu verarbeiten. Ich lese darüber nach, ein Modell zu haben und dann eine der Methoden in diesem Modellprozess im Hintergrund zu haben, aber das ist anders.

Solution (basierend auf der Antwort unten):

habe ich folgendes:

app/Jobs/parse_and_process_spreadsheet_job.rb

class ParseAndProcessSpreadsheetJob < ApplicationJob 
    queue_as :default 

def perform(temp_file_path, followed_id) 
    @spreadsheet = helpers.open_worksheet(temp_file_path) 
    number_of_rows = @spreadsheet.count - 1 
    helpers.process_spreadsheet(number_of_rows, @spreadsheet, followed_id) 
    helpers.remove_uploaded_file(temp_file_path) 
    redirect_to root_path, notice: t('fw_exports.file_successfully_processed') 
end 

Ende

Und meine app/controllers /fw_exports_controller.rb:

def process_parsed_spreadsheet 
    ParseAndProcessSpreadsheetJob.perform(params[:temp_file_path], params[:followed_id]) 
end 

Antwort

1

Nach the documentation sollten Sie handle_asynchronously :process_parsed_spreadsheet nach Ihrer Klassenmethode hinzufügen können.

Wenn ich active_job verwendet habe, erstelle ich in der Regel eine neue Datei in app/jobs z. process_spreadsheet_job.rb und erstellen Sie dann eine neue Klasse, die von ApplicationJob erbt. Hier ist ein minimales Beispiel:

class ProcessSpreadsheetJob < ApplicationJob 

    queue_as :default 

    def perform(temp_file_path:) 
     # Your custom method here. 
    end 
end 

Dann können Sie ProcessSpreadsheetJob.perform_later() in Ihrem Anwendungssteuerung aufrufen und haben einen Job in die Warteschlange aufgenommen.

+0

@EastsideDeveloper Entschuldigung, es war 'perform_later' nicht' perform' - aktualisiert in meiner Antwort. Sie können auch auf diesen Abschnitt der Dokumentation zum Einreihen eines Jobs verweisen: http://guides.rubyonrails.org/active_job_basics.html#enqueue-the-job –

+0

Ich bekomme jetzt atm: ActiveJob :: SerializationError (Nicht unterstützter Argumenttyp : ActionController :: Parameters) Ich werde es überprüfen – EastsideDeveloper

+0

Können Sie versuchen, den Pfad der temporären Datei als Zeichenfolge anstelle von Postparams übergeben? http://edgeapi.rubyonrails.org/classes/ActiveJob/SerializationError.html –

Verwandte Themen