3

我们使用 rake 任务每 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>"

我可能遗漏了一些明显的东西,我可以想出一些方法来做到这一点,但其中大多数都不是 DRY,我不想在帮助程序、模型或任务本身中生成大量 html。

让我知道是否有办法让我做到这一点。

4

3 回答 3

3

来自HAML 文档的更直接的方法:

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

您必须做一些工作来加载 HAML 模板并设置任何需要插值的局部变量,但灵活性可能会弥补这一点。

于 2009-08-11T22:45:46.790 回答
2

执行此操作的常用方法(通常不建议这样做)是在模型或 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

于 2009-08-11T16:50:50.360 回答
0

有点摸不着头脑,但是如果您查看 rdoc 中的 Haml,它很可能有一个接受字符串和一些变量然后呈现输出的方法。

使用 ERB,它看起来像:

require 'erb'

name = 'world'
template = 'hello <%= name %>'
template = ERB.new(template)
puts template.result(binding)
于 2009-08-11T16:55:32.490 回答