2014-05-20 10 views
1

使用Sinatra和Slim,我該如何做模板繼承?我無法在Google上找到答案,Slim上的文檔很少。比方說,我有以下文件:如何使用Sinatra和Slim做模板繼承?

main.rb的

# Sinatra app 
get '/login' do 
    slim :login 
end 

get '/display' do 
    slim :display 
end 

layout.slim

html 
    body 
     == yield 

sub_layout.slim

div[id="parent_div"] 
    div[id="child_div"] 
     h3 Rendering content 
     == yield 
     p display.slim should be rendered in == yield 

    div[id="child_div"] 
     h1 Rendering stuff in sublayout 
     p Hello this div should go underneath the above div. 

login.slim

p Welcome to the login page 

display.slim

p Welcome to the display page 

默認情況下,斯利姆將生成登錄時使用layout.slim爲基礎,所以它會自動繼承並顯示模板。

不過,我想display.slimsub_layout.slim,這反過來又繼承layout.slim繼承。 login.slim將直接從繼承layout.slim,這是默認行爲,所以這很好。

我如何用Sinatra和Slim做到這一點?

回答

1

你要求的是對佈局文件的任意調用。有時你需要它,有時候你不需要。讓Sinatra很難知道接下來會發生什麼。

我建議你使用諧音:

# in your app.rb 
helpers do 
    def partial(template, locals = {}) 
    slim template, :layout => false, :locals => locals 
    end 
end 

然後你可以使用常規的佈局文件,並將它在默認情況下調用。像你一樣做。

display.slim然後你可以打電話給你的sublayout部分:

==partial :sub_layout 

就是這樣。效果很好。你甚至可以使用多個部分或嵌套它們。隨你喜歡。

+0

謝謝,但我該如何讓'display.slim'呈現在'sub_layout.slim'的特定區域?我修改了我的問題,其中'sub_layout.slim'具有'== yield',如果一個tmeplate想要使用子佈局,所有內容都應該去。 – user21398

+0

嗯,不知道。不太明白爲什麼你會想要那樣複雜的事情。但我的第一個猜測是檢查傾斜:https://github.com/rtomayko/tilt它負責在Sinatra中渲染模板,它看起來像你可以但在另一個塊中dislpay被重組。 – three