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
@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 –
Ich bekomme jetzt atm: ActiveJob :: SerializationError (Nicht unterstützter Argumenttyp : ActionController :: Parameters) Ich werde es überprüfen – EastsideDeveloper
Können Sie versuchen, den Pfad der temporären Datei als Zeichenfolge anstelle von Postparams übergeben? http://edgeapi.rubyonrails.org/classes/ActiveJob/SerializationError.html –