如何在模型中使用Sinatra的Haml-helper?

时间:2011-03-27 00:11:41

标签: ruby sinatra haml

在我的一个模型中,我有一个发送电子邮件的方法。我想通过Haml文件标记此电子邮件,该文件与我的其他视图一起存储。

有没有办法从模型中调用Sinatra的HAML帮助器?如果没有,我需要像这样直接打电话给Haml:

@name = 'John Doe'
Haml::Engine.new(File.read("#{MyApplication.views}/email.haml")).to_html

Haml模板是否有办法访问@name实例变量?

3 个答案:

答案 0 :(得分:5)

尝试这样的事情:

tmpl = Tilt.new("#{MyApplication.views}/email.haml")
tmpl.render(self) # render the template with the current model instance as the context

希望这有帮助!

答案 1 :(得分:4)

不使用Tilt,您只需在Haml中执行此操作:

require 'haml'
@name = 'John Doe'
html = Haml::Engine.new('%p= @name').render(self)
#=> "<p>John Doe</p>\n"

上面传递给the render methodself是此处的关键,提供了评估模板的范围。

当然,你可以直接提供Haml模板字符串,如上所述,或者从文件中读取它:

Haml::Engine.new(IO.read(myfile)).render(self)

答案 2 :(得分:1)

我不确定HAML是电子邮件的好选择。我使用ERB或Erubis是因为它们允许更多的自由形式渲染,这对于填充变量字段非常有用。

如果您正在为MIME电子邮件创建HTML附件,那么HAML对于该部分邮件来说是一个不错的选择,但同样,我可能会抓住ERB或Erubis来创建MIME的文本部分正文和HTML部分。

如果您不想使用ERB / Erubis,请查看使用正常的“here-to”字符串,例如:

body = <<EOT
Dear #{whoever},

You owe me #{ lots_of_dollars } bucks. Pay by #{ when_i_need_it } or I'll shave my yak.

Your's truly,

#{ who_i_am }
EOT

我认为HAML是一个很棒的工具,但在我看来,它并不适合这种情况。