Rails Как сохранить вывод HTML партиала HAML в виде строки для отправки во внешнюю службу?

Мы автоматически генерируем информационный бюллетень каждые 24 часа, используя рейк-задачу. В верхней части информационного бюллетеня есть раздел, в котором администратор может поместить индивидуальное сообщение. Экран, который использует администратор, имеет предварительный просмотр информационного бюллетеня в реальном времени (они настаивали на этом), отображаемый с использованием партиала haml, который принимает коллекцию.

Чтобы генерировать и отправлять электронные письма, мы отправляем XML-документы стороннему API, которые содержат (среди прочего) HTML для электронного письма, которое мы хотели бы сгенерировать.

Что я хочу сделать, так это сохранить вывод этого партиала haml в задаче rake, что-то похожее на функции буферизации PHP ob_*(). Есть ли способ сделать что-то вроде следующего:

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

Я, вероятно, упустил что-то очевидное, и я мог бы придумать несколько способов сделать это, но большинство из них не СУХИЕ, и я не хочу генерировать много html в помощниках, моделях или самой задаче.

Дайте мне знать, если есть способ сделать это.


person Neil Sarkar    schedule 11.08.2009    source источник


Ответы (3)


Обычный способ сделать это (который обычно не рекомендуется) — отобразить строку в вашей модели или задаче rake:


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

более полное описание см. здесь: http://www.compulsivoco.com/2008/10/rendering-rails-partials-in-a-model-or-background-task/

Если вы используете кэширование страниц или фрагментов, вы можете извлечь содержимое из кеша. Самый простой способ сделать это — просто включить кэширование, а затем посмотреть, куда помещаются файлы.

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

person klochner    schedule 11.08.2009
comment
большое спасибо, это именно то, что я искал, но теперь, когда вы упомянули об этом, кеширование информационного бюллетеня будет иметь гораздо больше смысла для моего приложения. - person Neil Sarkar; 11.08.2009

Более прямой подход из документов по HAML:

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

Вам придется немного поработать, загрузив шаблон HAML и настроив любые локальные переменные, требующие интерполяции, но гибкость может компенсировать это.

person Nick Zadrozny    schedule 11.08.2009

Небольшой выстрел в темноте, но если вы проверите rdoc для Haml, он, скорее всего, имеет метод, который принимает строку и некоторые переменные, а затем визуализирует вывод.

С ERB это будет выглядеть примерно так:

require 'erb'

name = 'world'
template = 'hello <%= name %>'
template = ERB.new(template)
puts template.result(binding)
person Kris    schedule 11.08.2009