如何在Sinatra中将erb模板与静态文件一起使用?

时间:2012-08-22 18:41:42

标签: ruby sinatra erb

我正在移植一个简单​​的HTML / CSS / JS站点,以便将Sinatra用作其后端。我感兴趣的主要是模板。现在,我有一个视图目录,其中包含名为“index.html.erb”的HTML文件和名为“layout.html.erb”的布局。虽然我想将Sinatra的模板与erb一起使用,但我正在研究的网站是静态的。换句话说,我的“index.html.erb”中没有任何特定于erb的代码。我现在只需要在views目录中进行布局。

有没有办法可以将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

2 个答案:

答案 0 :(得分:4)

阅读Sinatra Readme后,您尝试做的事情中出现了两个主要问题。首先,静态文件与模板文件:Sinatra没有纯HTML的模板渲染器,因此您必须使用ERB。由于ERB可以是纯HTML,因此问题是Sinatra只能为ERB使用某个文件扩展名列表(并且.html不是其中之一)。

第二个问题是,在您的示例代码中,您必须使布局文件夹与templates文件夹不同(Sinatra认为它是相同的,默认情况下为/views)。

考虑到这一点,你能得到的最接近的是:

require 'sinatra'

configure do
  set :views, root
end

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

然而,这也存在一些问题。首先,如上所述,您必须使用.html.erb扩展名命名您的文件(如果您从上面第7行中删除.erb,则只需.html)。此外,任何人都可以访问服务器上/index.html.erb的原始模板文件。因此,您在原始问题中显示的方法是在Sinatra中执行您尝试执行的操作而不提供纯HTML文件的最佳方法。

答案 1 :(得分:0)

我正在使用jquery来实现这个目标:

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

thtml.erb

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

将html文件放在文件夹/ p​​ublic / t-html中。不要忘记在layout.erb中包含jquery。