2012-08-22 23 views
0

我正在將一個純HTML/CSS/JS網站移植到其後端使用Sinatra。我感興趣的主要是模板。目前,我有一個views目錄,其中包含名爲「index.html.erb」的HTML文件和名爲「layout.html.erb」的佈局。雖然我想用erb使用Sinatra的模板,但我正在使用的網站是靜態的。換句話說,我的「index.html.erb」沒有任何特定於erb的代碼。現在我只需要在我的視圖目錄中進行佈局。如何在Sinatra中使用帶有靜態文件的erb模板?

有沒有一種方法可以將views/index.html.erb移動到public/index.html,但仍然將其包含在模板views/layout.html中?

require 'rubygems' 
require 'sinatra' 

get '/index.html' do 
    @page_title = 'Home' 
    @page_id = 'index.html' 
    erb :'index.html', { :layout => :'layout.html' } 
end 

回答

4

通讀了Sinatra Readme之後,出現了兩個主要的問題。首先,靜態文件與模板文件:Sinatra沒有用於純HTML的模板渲染器,因此您必須使用ERB。由於ERB可以是簡單的HTML,所以問題在於Sinatra只能使用ERB的某個文件擴展名列表(並且.html不是其中之一)。

第二個問題是,在您的示例代碼中,您將不得不將layout文件夾與模板文件夾(Sinatra認爲是相同的,默認爲/views)不同。

考慮到這一點,你可以得到你所要求的最接近的是以下幾點:

require 'sinatra' 

configure do 
    set :views, root 
end 

get '/index.html' 
    erb :'public/index.html', { :layout => :'views/layout.html' } 
end 

然而,這也有一些問題。首先,如前所述,您必須使用.html.erb分機命名您的文件(或者,如果您將.html從上面的第7行中刪除,則只需.erb)。此外,任何人都可以訪問服務器上的/index.html.erb原始模板文件。因此,您在原始問題中顯示的方法是在Sinatra中執行您想要執行的操作而不提供純HTML文件的最佳方法。

+0

因此,如果我使用erb模板來包裝其他文件的佈局文件,那麼其他文件也必須是佈局文件?另外,爲什麼我需要單獨的佈局和模板文件夾? –

+0

是的,如果你想使用模板,另一個文件也必須是模板。而且,您不一定需要單獨的文件夾,但我認爲這就是您的問題所要求的:/ views中的佈局和/ public中的模板。 –

+0

啊好的,謝謝! –

0

我使用jQuery來實現:

get '/thtml/:path' do 
    @path = params[:path] 
    erb :thtml 
end 

thtml.erb

<%= "<script>$('#main').load('/t-html/#{@path}')</script>" %> 

放置HTML文件文件夾/公共/ T-HTML。不要忘記在layout.erb中包含jquery。