Rails - Come salvare l'output HTML di un HAML parziale, come una stringa da inviare a un servizio esterno?

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

Domanda

Ciao ragazzi, primo post qui, spero che tu mi possa aiutare.

Stiamo generando una newsletter automaticamente ogni 24 ore utilizzando un compito rastrello. C'è una sezione nella parte superiore della newsletter in cui un amministratore può inserire un messaggio personalizzato. Lo schermo che utilizza l'amministratore ha un'anteprima in tempo reale della newsletter (erano insistenti su questo), reso utilizzando un Haml parziale che prende una collezione.

Al fine di generare e inviare i messaggi di posta elettronica, stiamo inviando i documenti XML a una terza parte che contengono API (tra le altre cose) il codice HTML per l'e-mail che vorremmo generare.

Quello che voglio fare è salvare l'uscita di questo Haml parziale entro un compito rastrello, qualcosa di simile a ob di PHP _ * () funzioni di buffering. Esiste un modo per fare qualcosa di simile al seguente:

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>"

Sono probabilmente manca qualcosa di ovvio, e mi veniva in mente un paio di modi per fare questo, ma la maggior parte di loro non sono asciutti e non voglio essere la generazione di un sacco di html nelle aiutanti, i modelli, o la compito stesso.

Vorrei sapere se c'è un modo per me per raggiungere questo obiettivo. Grazie.

È stato utile?

Soluzione

Un modo comune per fare questo (che è tipicamente sconsigliati) è quello di rendere in una stringa nel modello o rake compito:


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

vedi qui per una descrizione più completa: http: // www .compulsivoco.com / 2008/10 / rendering-rails-parziali-in-a-model-o-background-task /

Se si sta utilizzando la pagina o il caching dei frammenti, si potrebbe tirare fuori il contenuto della cache. Il modo più semplice per farlo è quello di consentire solo la cache, e poi guardare dove vengono collocati i file.

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

Altri suggerimenti

Un approccio più diretto dalla HAML docs :

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

Si dovrà fare un po 'di lavoro caricando il modello HAML e la creazione di tutte le variabili locali che hanno bisogno di interpolazione, ma la flessibilità può fare per questo.

Un po 'di un salto nel buio, ma se si estrae la rdoc per Haml è più che probabile ha un metodo che accetta una stringa e alcune variabili e quindi rende l'uscita.

Con ERB sarebbe simile a:

require 'erb'

name = 'world'
template = 'hello <%= name %>'
template = ERB.new(template)
puts template.result(binding)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top