2009-06-07 7 views
1

J'ai un travail cron analysant quelques flux XML toutes les dix minutes et créant quelques partiels à inclure sur chaque page de mon projet Rails avec la méthode render: file. Le problème est que, évidemment, ils ne s'actualisent pas jusqu'à ce que le serveur redémarre.Rendu d'un fichier modifié en externe dans Rails

Quoi qu'il en soit, que puis-je faire pour forcer les rails à rafraîchir ce fichier à chaque fois?

Merci d'avance.

Répondre

2

Je pense que vous utilisez abusivement (: fichier). Ce n'est certainement pas la façon dont il est destiné à être utilisé. Le rendu d'un partial est supposé être utilisé pour rendre un morceau modulaire de code erb (ou quel que soit le template que vous utilisez) à plusieurs endroits, pas une technique de chargement de données. Vous l'utilisez (il apparaît) pour charger des données changeant dynamiquement.

Je pense que ce que vous essayez vraiment de faire est la mise en cache de fragments, mais sans plus de contexte, je peux me tromper.

Pour une grande visite virtuelle sur la mise en cache de fragments: http://www.railsenvy.com/2007/3/20/ruby-on-rails-caching-tutorial-part-2

probablement votre tâche cron serait exécuter un script script/runner qui créeraient le fragment que vous cherchez à mettre en cache.

Si je suis hors de la base ici, s'il vous plaît essayer de clarifier quel type de fichier que vous chargez et ce que vous essayez d'accomplir.

+0

Je suis d'accord. On dirait qu'un cache fragmentaire ferait l'affaire. Avoir le travail cron expirer le cache de fragments, puis l'erb va passer à travers et ils seront mis en cache la prochaine fois qu'ils sont affichés. – Shadwell

1

Cela se produit car Rails encaisse toutes ses classes et vues/partiels en mode production. Pour résoudre ce problème, vous pouvez rendre vos partiels à l'intérieur du bloc de mise en cache des fragments et utiliser la méthode expire_fragment lorsque vous souhaitez actualiser le contenu du bloc. D'une autre manière, vous pouvez passer au mode développement, mais cela ralentira votre application.

+2

Solution est certainement pas en cours d'exécution de l'application dans le développement. C'est une idée terrible. Une idée moins terrible, mais toujours horrible, est d'activer le rechargement de classe en production, mais c'est à peu près le pire des cas. –

6

Utilisez plutôt:

render :inline => File.read(file_name), :layout => true 
Questions connexes