Rails - Как сохранить вывод HTML части HAML в виде строки для отправки на внешний сервис? - PullRequest
3 голосов
/ 11 августа 2009

Эй, ребята, первый пост здесь, надеюсь, вы можете помочь мне.

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

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

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

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 в помощниках, моделях или Само задание.

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

Ответы [ 3 ]

3 голосов
/ 12 августа 2009

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

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

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

2 голосов
/ 11 августа 2009

Распространенный способ сделать это (что обычно не рекомендуется) - сделать рендеринг в строку в вашей модели или в задаче 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

0 голосов
/ 11 августа 2009

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

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

require 'erb'

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