2010-06-11 4 views
1

Puis-je effectuer les opérations suivantes?Appel d'une tâche de rake depuis l'observateur ActiveRecord

def ModelObserver < ActiveRecord 

    def after_save 
    Rake::Task[name].invoke 
    end 

end 

Pour le moment, cela renvoie l'erreur suivante:

Don't know how to build task 'name' 

Toute idée?

+1

Quelle tâche Rake essayez-vous d'invoquer? Est-ce celui que vous avez écrit vous-même? –

+0

Tâches que j'ai écrites et tâches écrites par d'autres, par ex. rake thinking_sphinx: reindex – auralbee

Répondre

3

Utilisez la commande du système:

def ModelObserver < ActiveRecord 

    def after_save 
    system "rake #{name}" 
    end 

end 
+1

Ceci est probablement lent comme l'enfer qui engendre la pile complète des rails. Vous ne voulez pas faire cela dans un observateur ... Surtout vous ne voulez vraiment pas le faire dans un crochet after_save ... – hurikhan77

+0

Juste regardé Railscast 127 (http://railscasts.com/episodes/127-rake -en arrière-plan). Mettre un & à la fin de l'appel, forcera le processus à fonctionner en arrière-plan. système "rake # {name} &" – auralbee

0

Je suppose que vous devez charger l'environnement Rake premier et le Rakefile. Je n'essaierais pas d'invoquer la ligne de commande fullblown pour le faire. Vous devez probablement utiliser "import" comme vous pouvez le voir dans le Rake API

2

Envisagez d'utiliser delayed job ou un plugin similaire pour gérer l'exécution en arrière-plan. Dans l'observateur (ou le contrôleur), notez simplement le démon du job d'arrière-plan, qu'il doit prendre en charge certaines actions, au lieu d'exécuter cette tâche directement.

2

Dans Rails3 si vous voulez encore appeler tâche Rake comme ceci:

Rake::Task[name].invoke 

vous devez mettre

[Application].load_tasks 

avant invoquer la commande, où l'application est le nom de votre application. Par exemple je devais mettre

Ead::Application.load_tasks