Rails - Como salvar a saída HTML de um HAML parcial como uma string para enviar para um serviço externo?
-
12-09-2019 - |
Pergunta
Ei, primeiro post aqui, espero que você possa me ajudar.
Estamos gerando um boletim automaticamente a cada 24 horas, utilizando uma tarefa rake. Há uma seção no topo do boletim em que um administrador pode colocar uma mensagem personalizada. A tela que os usos de administração tem uma visualização ao vivo do boletim (eram insistente sobre isso), processado usando um haml parcial que leva uma coleção.
A fim de gerar e enviar os e-mails, estamos enviando documentos XML para um terceiro API partido que contêm (entre outras coisas) a HTML para o e-mail que gostaria de gerar.
O que eu quero fazer é salvar a saída deste haml parcial dentro de uma tarefa rake, algo semelhante ao ob de PHP _ * () tamponantes funções. Existe alguma maneira de fazer algo como o seguinte:
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><html><body>#{newsletter_html}</body></html></HTML>
...
</Creative>"
Eu sou provavelmente faltando alguma coisa óbvia, e eu poderia pensar em algumas maneiras de fazer isso, mas a maioria deles não estão secos e eu não quero estar gerando um monte de html nas ajudantes, modelos, ou a tarefa em si.
Deixe-me saber se há uma maneira para eu fazer isso. Obrigado.
Solução
Uma maneira comum de fazer isso (que normalmente é desaconselhadas) é tornar em uma corda em seu modelo ou ancinho tarefa:
cached_content =
ActionView::Base.new(Rails::Configuration.new.view_path).render(:partial => "newsletter", :locals => {:page => self,:collection => posts})
veja aqui para uma descrição mais completa: http: // www .compulsivoco.com / 2008/10 /-rendering-rails-parciais in-a-modelo-ou-background-tarefa /
Se você estiver usando página ou cache de fragmento, você pode puxar o conteúdo do cache. A maneira mais fácil de fazer isso é apenas para habilitar o cache, e depois olhar para onde os arquivos estão sendo colocados.
Outras dicas
Uma abordagem mais directa do HAML docs :
require 'haml'
haml_string = "%p Haml-tastic!"
engine = Haml::Engine.new(haml_string)
engine.render #=> "<p>Haml-tastic!</p>\n"
Você vai ter que fazer um pouco de carga de trabalho se o modelo HAML e configurar todas as variáveis ??locais que precisam de interpolação, mas a flexibilidade pode compensar isso.
Um pouco de um tiro no escuro, mas se você verificar o rdoc para Haml-lo mais do que provável que tenha um método que aceita uma string e algumas variáveis ??e, em seguida, torna a saída.
Com ERB-lo seria algo parecido com:
require 'erb'
name = 'world'
template = 'hello <%= name %>'
template = ERB.new(template)
puts template.result(binding)