在我的一个模型中,我有一个发送电子邮件的方法。我想通过Haml文件标记此电子邮件,该文件与我的其他视图一起存储。
有没有办法从模型中调用Sinatra的HAML帮助器?如果没有,我需要像这样直接打电话给Haml:
@name = 'John Doe'
Haml::Engine.new(File.read("#{MyApplication.views}/email.haml")).to_html
Haml模板是否有办法访问@name
实例变量?
答案 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
method的self
是此处的关键,提供了评估模板的范围。
当然,你可以直接提供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是一个很棒的工具,但在我看来,它并不适合这种情况。