Je voudrais lancer une tâche dans mon contrôleur. Est-ce qu’il y a un moyen de faire ça?
Je suis d’accord avec ddfreynee, mais si vous savez ce dont vous avez besoin, le code peut ressembler à ceci:
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
Vous pouvez exiger l'utilisation de 'rake' et de .load_tasks dans un initialiseur.
Je ne trouve pas le style d’appeler une tâche de rake dans le code. Je recommande de mettre le code pour la tâche que vous voulez exécuter quelque part en dehors d’une tâche de rake, et de demander à la tâche rake d’appeler ce code.
Cela a non seulement l’avantage d’être facile à appeler en dehors du rake (ce qui est ce que vous voulez), mais cela facilite également le test de la tâche.
Vous pouvez le faire dans votre contrôleur:
%x[rake name_task]
with: name_task
est le nom de votre tâche
Au lieu d’essayer d’appeler une tâche de rake dans un contrôleur, appelez un object de service contenant la logique que vous essayez d’exécuter.
class SomeController < ApplicationController def whatever SomeServiceObject.call end end
... et puis, en supposant que vous parlez d'une tâche de râteau personnalisée, demandez-lui également d'appeler l'object de service:
namespace :example do desc 'important task' task :important_task do SomeServiceObject.call end end
Si vous n'êtes pas familier avec les objects de service, ce ne sont que de vieilles classes Ruby qui effectuent un travail spécifique. Si vous essayez d'appeler certaines des tâches de rake par défaut (par exemple: db: migrate), je vous recommande fortement de ne pas faire ce genre de choses avec un contrôleur.