web-dev-qa-db-fra.com

Exécuter la tâche de râteau dans le contrôleur

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?

70
user143482

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.

60
Grimmo

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.

56
Denis Defreyne

Vous pouvez le faire dans votre contrôleur:

%x[rake name_task]

avec: name_task est le nom de votre tâche

16
olibouli

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.

14
Jarrod Spillers