Ich möchte eine Rechenaufgabe in meinem Controller ausführen. Gibt es eine Möglichkeit, dies zu tun?
ruby-on-rails
ruby
rake
user143482
quelle
quelle
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.
quelle
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.
quelle
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.
quelle
Sie können dies in Ihrem Controller tun:
%x[rake name_task]
mit:
name_task
ist der Name Ihrer Aufgabequelle