Rails - Comment économiser sortie HTML d'une HAML partielle en tant que chaîne à envoyer à un service externe?

StackOverflow https://stackoverflow.com/questions/1261422

Question

Hé les gars, premier post ici, espérons que vous pouvez me aider.

Nous générons un bulletin d'information automatiquement toutes les 24 heures à l'aide d'une tâche de râteau. Il y a une section en haut de la lettre d'information où un administrateur peut mettre un message personnalisé. L'écran que l'administrateur utilise a un aperçu en direct de la lettre d'information (ils ont insisté sur ce point), rendu en utilisant une partie haml qui prend une collection.

Pour générer et envoyer les e-mails, nous envoyons des documents XML à une API tiers qui contiennent (entre autres) le code HTML pour l'e-mail que nous aimerions générer.

Ce que je veux faire est de sauvegarder la sortie de ce haml partiel à l'intérieur d'une tâche de râteau, quelque chose de similaire à ob PHP _ * () fonctions de mise en mémoire tampon. 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 être générer beaucoup de HTML dans les aides, les modèles, ou tâche elle-même.

Faites-moi savoir s'il y a un moyen pour moi d'y arriver. Merci.

Était-ce utile?

La solution

Une façon courante de faire cela (ce qui est généralement déconseillé) 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 / rendu-rails en partials un modèle ou fond-tâche /

Si vous utilisez la page ou la mise en cache de fragments, vous pouvez tirer le contenu du cache. La meilleure façon de le faire est de permettre la mise en cache tout, puis regarder où les fichiers sont placés.

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

Autres conseils

Une approche plus directe de la 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 travail charger le modèle HAML et la mise en place des variables locales qui ont besoin d'interpolation, mais la flexibilité peut compenser cela.

Un peu d'un coup de feu dans l'obscurité, mais si vous consultez le rdoc pour Haml plus que ce qui 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top