【问题标题】:How can I use erb templates with static files in Sinatra?如何在 Sinatra 中使用带有静态文件的 erb 模板?
【发布时间】:2012-08-18 05:56:54
【问题描述】:

我正在将一个纯 HTML/CSS/JS 站点移植到使用 Sinatra 作为其后端。我最感兴趣的是模板。现在,我有一个名为“index.html.erb”的 HTML 文件和一个名为“layout.html.erb”的布局的视图目录。虽然我想将 Sinatra 的模板与 erb 一起使用,但我正在处理的站点是静态的。换句话说,我的“index.html.erb”中没有任何特定于 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

【问题讨论】:

    标签: ruby sinatra erb


    【解决方案1】:

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

    第二个问题是,在您的示例代码中,您的布局文件夹必须与模板文件夹不同(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 行中删除 .html,则只需 .erb)。此外,任何人都可以访问您服务器上/index.html.erb 的原始模板文件。因此,您在原始问题中显示的方法是执行您在 Sinatra 中尝试执行的操作而不提供纯 HTML 文件的最佳方式。

    【讨论】:

    • 所以如果我为我的布局文件使用 erb 模板来包裹其他文件,那么那些其他文件也必须是布局文件吗?另外,为什么我需要单独的布局和模板文件夹?
    • 是的,如果你想使用一个模板,另一个文件也必须是一个模板。而且,您不一定需要单独的文件夹,但我认为这就是您的问题所要求的:/views 中的布局和 /public 中的模板。
    【解决方案2】:

    我正在使用 jquery 来完成此操作:

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

    thtml.erb

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 2016-10-09
      • 2016-07-07
      • 2018-12-21
      • 2020-11-13
      • 2019-06-26
      • 2011-01-27
      • 2012-03-17
      相关资源
      最近更新 更多