2011-03-25 66 views
17

我真的不需要爲我非常小的項目開發Rails的開銷,所以我試圖用普通的Ruby和HAML來實現它。在沒有Rails的Ruby中部分HAML模板

我想在我的HAML模板中包含另一個HAML文件。但我還沒有找到一個好的或者真正有用的方法來做到這一點。

例如,我有這兩個文件HAML:

documents.haml

%html 
%body 
    = include(menu.haml) body 
    %article … 

menu.haml

%ul 
%li 
    %a whatever … 

包括顯然是不走這裏的路。但是在這個例子中,它描述了我想要實現的功能。

回答

18

我以前做過這個,只是爲了一個快速又髒的模板製作人。最簡單的方法是隻渲染HAML的父對象中:

%p some haml that's interesting 
= Haml::Engine.new('%p this is a test').render 
%p some more template 

你會更可能要建立一些方法,使這更容易 - 一對夫婦的輔助方法。也許你會寫一個名爲render_file的文件作爲參數。這種方法可能看起來像:

def render_file(filename) 
    contents = File.read(filename) 
    Haml::Engine.new(contents).render 
end 

然後,你的範本看起來更像:

%p some template 
= render_file('some_filename.haml') 
%p more template 

注意,你可能需要通過自己原來的Haml的::引擎渲染,使其知道如何找到你的render_file方法。

+0

謝謝,這正是我一直在尋找的!我很感激,並感謝提供的幫助方法。 – Aeyoun 2011-03-25 23:47:12

+0

你打賭。當我所做的事情對其他人有用時,這很好。祝你好運。 – 2011-03-26 00:09:02

+7

如何將幫助器方法包含到haml模板中? – 2013-06-08 03:31:18

23

我完全推薦這些東西的Tilt寶石。它提供了一個標準接口,用於使用相同的API呈現許多不同的模板語言,讓您設置自定義範圍和本地化,讓您使用收益率,並且強大且快速。 Sinatra將其用於模板。

例子:

require 'haml' 
require 'tilt' 

template = Tilt.new('path/to/file.haml') 
# => #<Tilt::HAMLTemplate @file="path/to/file.haml" ...> 
layout = Tilt.new('path/to/layout.haml') 

output = layout.render { template.render } 

這讓你yield佈局內得到呈現模板,就像Rails的。至於部分,大衛已經描述了一個簡單而好的方法。但實際上,如果你正在編寫的內容將通過HTTP提供,我建議你看看Sinatra,它已經提供了模板,並且具有你可以想象的最簡單的請求路由。

+1

我是第二個傾斜的寶石。 – superluminary 2012-05-28 11:14:10

+1

我將第三個傾斜的寶石 – 2012-07-15 15:45:32

0
def render_file(filename) 
    contents = File.read('views/'+filename) 
    Haml::Engine.new(contents).render 
end 
+7

而不是隻發佈一段代碼,請*解釋*爲什麼這段代碼解決了問題構成。沒有解釋,這不是一個答案。 – 2012-11-29 11:28:20

3

我剛剛使用David Richards在串聯方式發佈指令巨大的成功,不變量,像這樣:

= Haml::Engine.new(File.read('/Volumes/Project/file_to_include.haml')).render

有顯然是一個更優雅的方式。但對於只想包含一個或兩個文件的人來說,這應該很好。這是一個缺點,即所有使用這些文件的基本文件必須在對後者進行一些更改後重新編譯。如果環境允許的話,可以使用php include。

-1

(添加此半多餘的答案,顯示一個人如何可以從其他的答案中包含的技術。)

包括這樣的事情在你的設置代碼猴子修補Haml的庫。

module Haml::Helpers 
    def render_haml(filename) 
    contents = File.read(Rails.root.join("app", "assets", "templates", filename)) 
    Haml::Engine.new(contents).render 
    end 
end 

然後在你的文件Haml的

.foo 
= render_haml('partial.haml') 
.bar 

顯然,這是一個Rails上下的例子(因爲我想用HAML在我的資產管道,而不是視圖)...你會想用項目模板或partials目錄中的filename替代Rails.root.join(...)