Ich möchte eine Rechenaufgabe in meinem Controller ausführen. Gibt es eine Möglichkeit, dies zu tun?
Ich möchte eine Rechenaufgabe in meinem Controller ausführen. Gibt es eine Möglichkeit, dies zu tun?
system "rake task_name"
Antworten:
Ich stimme ddfreynee zu, aber falls Sie wissen, wie Sie Code benötigen, kann dies aussehen:
require 'rake'
Rake::Task.clear # necessary to avoid tasks being loaded several times in dev mode
Sample::Application.load_tasks # providing your application name is 'sample'
class RakeController < ApplicationController
def run
Rake::Task[params[:task]].reenable # in case you're going to invoke the same task second time.
Rake::Task[params[:task]].invoke
end
end
Sie können stattdessen 'rake' und .load_tasks in einem Initialisierer benötigen.
config/application.rb
als Modulname ungefähr 12 Zeilen weiter unten, vorausgesetzt, Sie verwenden Rails.
Rails.application
Ich finde es nicht gut, eine Rechenaufgabe im Code aufzurufen. Ich empfehle, den Code für die Aufgabe, die Sie ausführen möchten, irgendwo außerhalb einer Rechenaufgabe zu platzieren und die Rechenaufgabe diesen Code aufrufen zu lassen.
Dies hat nicht nur den Vorteil, dass es einfach ist, einen externen Rechen aufzurufen (was Sie möchten), sondern es erleichtert auch das Testen der Rechenaufgabe erheblich.
Anstatt zu versuchen, eine Rake-Task in einem Controller aufzurufen, rufen Sie ein Serviceobjekt auf, das die Logik enthält, die Sie ausführen möchten.
class SomeController < ApplicationController
def whatever
SomeServiceObject.call
end
end
... und dann, vorausgesetzt, Sie sprechen von einer benutzerdefinierten Rechenaufgabe, lassen Sie sie auch das Serviceobjekt aufrufen:
namespace :example do
desc 'important task'
task :important_task do
SomeServiceObject.call
end
end
Falls Sie mit Serviceobjekten nicht vertraut sind, handelt es sich lediglich um alte Ruby-Klassen, die einen bestimmten Job ausführen. Wenn Sie versuchen, einige der Standard-Rake-Tasks aufzurufen (z. B. db: migrate), würde ich dringend empfehlen, so etwas nicht von einem Controller aus auszuführen.
Sie können dies in Ihrem Controller tun:
%x[rake name_task]
mit: name_task
ist der Name Ihrer Aufgabe