2010-12-13 97 views
1

Ou est-ce que je pense à ce problème? Fondamentalement, je veux être en mesure de télécharger un fichier zip sur un modèle, et après le téléchargement je veux exécuter un tas de processus sur elle. Ce serait sympa de pouvoir le faire depuis l'arrière/console, ainsi que de déclencher les actions via l'interface frontale des rails.Une tâche de rake peut-elle être déclenchée via une interface rails?

L'idée ici:

Galerie a collection.zip

Galerie a beaucoup d'enfants: article

collection.zip a des informations pour chaque article

Je veux déclencher une galerie de lots Processus .items.build qui extraira l'information du zip et l'utilisera pour créer les nouveaux éléments. J'ai pensé à utiliser Paperclip :: Processor pour cette tâche, mais je n'ai pas encore trouvé beaucoup de documentation vraiment utile ou complète sur la façon dont cela fonctionnerait, et l'expérimentation a seulement conduit à la frustration et à la confusion. J'ai vu certaines personnes utiliser des tâches de rake pour ce genre de choses, mais je ne veux vraiment pas avoir à utiliser la console pour faire la tâche, et je voudrais vraiment avoir un bouton qui dit "Générer la galerie" qui va tourner toutes les tâches nécessaires.

Alors, y a-t-il un moyen de le faire? Serait-ce considéré comme une mauvaise pratique? Si oui, y a-t-il un autre moyen d'aborder ce problème?

Répondre

2

Vous pouvez déclencher une tâche de rake à partir de rails, mais j'écrirais la logique pour décompresser et traiter le fichier zip dans une classe ou un module. Ensuite, vous pouvez utiliser ce code dans n'importe quel endroit.

+0

Si je devais exécuter une tâche de râteau dans des rails, comment serait-ce mis en œuvre? Ou serait-il préférable d'écrire cela comme une méthode dans le modèle de la galerie? –

+0

Vous feriez mieux d'écrire des méthodes dans votre modèle de galerie pour ce faire. Bien que vous puissiez avoir besoin des bibliothèques nécessaires pour vous permettre de charger et d'invoquer une tâche rake, ce n'est vraiment pas la bonne chose à faire dans la plupart des cas, sinon dans tous les cas. Ce n'est pas ce pour quoi le râteau a été construit. – idlefingers

4

delayed_job ou resque sont considérés comme les meilleures pratiques pour le traitement de fond, plutôt que d'exécuter une tâche de râteau.

L'idée centrale derrière les deux:

  1. scripts de traitement par lots ou code qui doit être exécuté en arrière-plan est conservé dans lib.
  2. Les travaux sont sérialisés et stockés dans la base de données (ou dans toute couche ou file d'attente persistante prise en charge, par exemple, Redis ou Starling) pendant le cycle de la demande.
  3. Daemon qui fonctionne en arrière-plan, va chercher des emplois dans la file d'attente et de les traiter dans diverses commandes (par exemple, la priorité ou fifo, etc.)