2009-08-11 8 views
3

Hé les gars, premier poste ici, j'espère que vous pouvez m'aider.Rails - Comment enregistrer la sortie HTML d'une HAML partielle en tant que chaîne à envoyer à un service externe?

Nous générons une newsletter automatiquement toutes les 24 heures en utilisant une tâche de rake. Il y a une section en haut de la newsletter où un administrateur peut mettre un message personnalisé. L'écran que l'administrateur utilise a un aperçu en direct de la newsletter (ils insistaient sur ce point), rendu à l'aide d'un partial haml qui prend une collection. Pour générer et envoyer les emails, nous envoyons des documents XML à une API tierce qui contient (entre autres) le code HTML pour l'email que nous souhaitons générer. Ce que je veux faire est de sauver la sortie de ce haml partiel dans une tâche de rake, quelque chose de similaire aux fonctions tampon de _ _ _() de PHP. Est-il possible de faire quelque chose comme ce qui suit:

ob_start(); 
render :partial => newsletter, :collection => posts 
newsletter_html = ob_get_contents() 
xml = " 
<Creative> 
    <Name>Our Newsletter -- #{Time.now.strftime('%m/%d/%Y')}</Name> 
    <HTML>&lt;html&gt;&lt;body&gt;#{newsletter_html}&lt;/body&gt;&lt;/html&gt;</HTML> 
    ... 
</Creative>" 

Je manque probablement quelque chose d'évident, et je ne pouvais penser à quelques façons de le faire, mais la plupart d'entre eux ne sont pas sèches et je ne veux pas générer beaucoup de html dans les helpers, les modèles, ou la tâche elle-même. Faites-moi savoir s'il y a un moyen pour moi d'accomplir cela. Merci.

Répondre

2

Une façon courante de faire cela (ce qui est généralement conseillé contre) est de rendre dans une chaîne dans votre tâche de modèle ou d'un râteau:


cached_content = 
    ActionView::Base.new(Rails::Configuration.new.view_path).render(:partial => "newsletter", :locals => {:page => self,:collection => posts}) 

voir ici pour une description plus complète: http://www.compulsivoco.com/2008/10/rendering-rails-partials-in-a-model-or-background-task/

Si vous utilisez la mise en cache de pages ou de fragments, vous pouvez extraire le contenu du cache. Le moyen le plus simple de le faire est d'activer la mise en cache, puis de regarder où les fichiers sont placés.

http://guides.rubyonrails.org/caching_with_rails.html

+0

Merci beaucoup, c'est exactement ce que je cherchais mais maintenant que vous le mentionnez, la mise en cache de la newsletter aurait beaucoup plus de sens pour mon application –

0

Un peu d'un coup de feu dans l'obscurité, mais si vous consultez le rdoc pour Haml plus que a probablement une méthode qui accepte une chaîne et certaines variables et rend alors la sortie.

Avec ERB il ressemblerait à quelque chose comme:

require 'erb' 

name = 'world' 
template = 'hello <%= name %>' 
template = ERB.new(template) 
puts template.result(binding) 
3

Une approche plus directe du HAML docs:

require 'haml' 
haml_string = "%p Haml-tastic!" 
engine = Haml::Engine.new(haml_string) 
engine.render #=> "<p>Haml-tastic!</p>\n" 

Vous aurez à faire un peu de charge de travail le modèle HAML et mettre en place des variables locales qui nécessitent une interpolation, mais la flexibilité peut compenser cela.

Questions connexes