Je voudrais exécuter une tâche de râteau 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 à quoi vous avez besoin, le code peut ressembler:
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 à la place 'rake' et .load_tasks dans un initialiseur.
Je ne trouve pas bon d'appeler une tâche de râteau dans le code. Je recommande de mettre le code de la tâche que vous souhaitez exécuter quelque part en dehors d'une tâche de râteau et de demander à la tâche de râteau d'appeler ce code.
Cela a non seulement l'avantage d'être facile à appeler en dehors du râteau (c'est ce que vous voulez), mais cela facilite également beaucoup le test de la tâche de râteau.
Vous pouvez le faire dans votre contrôleur:
%x[rake name_task]
avec: name_task
est le nom de votre tâche
Au lieu d'essayer d'appeler une tâche de râteau dans un contrôleur, appelez un objet de service qui contient la logique que vous essayez d'exécuter.
class SomeController < ApplicationController
def whatever
SomeServiceObject.call
end
end
... puis, en supposant que vous parlez d'une tâche de râteau personnalisée, demandez-lui également d'appeler l'objet service:
namespace :example do
desc 'important task'
task :important_task do
SomeServiceObject.call
end
end
Dans le cas où vous n'êtes pas familier avec les objets de service, ils sont tout simplement anciens Ruby classes qui font un travail spécifique. Si vous essayez d'appeler certaines des tâches de râteau par défaut (par exemple: db: migrate ) Je recommande fortement de ne pas faire ce genre de chose à partir d'un contrôleur.