2011-03-27 48 views
4

在我的一個模型中,我有一個發送電子郵件的方法。我想通過與我的其他視圖一起存儲的Haml文件標記此電子郵件。如何在模型中使用Sinatra的Haml-helper?

有沒有辦法從模型中調用Sinatra的HAML-helper?如果沒有,我會需要直接調用Haml的,像這樣:

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

是否有引入haml模板的方式來訪問該@name實例變量?

回答

5

嘗試這樣:

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

希望這有助於!

+0

是的,做了詭計。謝謝一堆! – Marc 2011-03-27 00:29:58

1

我不確定HAML是電子郵件的好選擇。我會使用ERB或Erubis,因爲它們允許更多的自由格式渲染,這對於填充可變字段非常有效。

如果你正在創建一個MIME郵件的HTML附件,那麼HAML將成爲郵件那部分的一個好選擇,但是,我可能會再次抓取ERB或者Erubis來創建文本部分MIME主體和HTML部分。

如果你不想使用ERB/Erubis,看看使用正常「這裏對」字符串,如:

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是一個偉大的工具,但是,在我看來, ,這不適合這種情況。

+0

感謝您的想法和解決方案。在我的情況下,只有HTML的電子郵件足夠好,所以我選擇了HAML。也就是說,很高興知道其他解決方案以備將來參考。 – Marc 2011-03-27 00:31:39

+1

我可以理解。提醒一下,許多人不喜歡HTML電子郵件,或者因爲他們的MUA不支持它甚至不能閱讀它。這是反對HTML電子郵件的重要論據之一,或者至少對於應該包含純文本主體的MIME來說。 – 2011-03-27 00:45:53

+0

如果您的應用程序已經使用Haml渲染視圖,Haml也是純文本電子郵件的完美解決方案。只需使用:普通過濾器即可完成。我的0.2CAD – Florin 2012-05-05 19:37:53

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) 
相關問題