1

我有一个 sinatra 应用程序,它主要使用 erb 作为模板,但我正在为需要在服务器端和客户端呈现的 html 块添加一些小胡子部分。我有一个“视图”目录,其中保存了所有模板,包括我添加的胡子模板。例如,结构看起来像这样:

views/
    index.html.erb
    _wingding.html.erb
    _widget.html.mustache

假设我正在使用这个端点渲染 index.html.erb:

get '/' do
    erb :index
end

在该模板中,我想渲染上述两个部分partial渲染组件,所以这里的问题仍然存在。]。所以 index.html.erb 包含:

<%= partial :wingding %>
<%= partial :widget %>

erb 部分(wingding)渲染得很好,但 mustache 部分(小部件)却没有。它会导致应用程序抛出异常:

找不到模板引擎:小胡子

我在项目中包含了“小胡子”宝石。我试过'require mustache/sinatra'register Mustache::Sinatra。这两种说法都有效,但没有解决上述问题。知道如何告诉 sinatra 关于小胡子的信息,以便它可以渲染小胡子部分吗?

我通过包含以下配置来设置我的视图目录:

configure do
    set :views, File.join(File.dirname(__FILE__), 'views')
end

版本号:

  • 西纳特拉 1.3.1
  • 小胡子 0.99.4
  • 红宝石 1.9.3
4

2 回答 2

2

因此,事实证明,我的其他答案中的解决方案中列出的 gem 缓存了输出,这意味着您不能使用它在同一请求中包含具有不同本地人的相同部分,这对于我的目的而言毫无价值。所以这是我已经确定的另一个(不可否认的hackish)解决方案。我创建了一个助手,它将只提供给定视图的内容:

helpers do
    def template_contents(path)
        File.open("#{settings.views}/#{path}") { |f| f.read }
    end
end

然后,我只是做一个常规的Mustache#render

<%= Mustache.render(template_contents('_widget.html.mustache'), { ... }) %>

这对我的用例很有用。

于 2012-11-09T22:31:15.557 回答
1

我想通了。首先,我必须注意一些我在发布问题时没有意识到的事情。partial实际上并没有内置到 sinatra 中。它作为sinatra-more gem 的一部分包含在我的应用程序中(已停产,它的大部分功能现在都在一个名为padrino的项目中,但在这个应用程序中仍然使用 sinatra-more)。部分方法是这样包含的:

require 'sinatra_more/render_plugin'

module Sinatra
    register SinatraMore::RenderPlugin
end

无论如何,这只是添加了该partial方法(以及其他一些渲染助手),但是此方法依赖于内置的 sinatra 渲染代码,因此这一事实与该问题中手头的实际问题无关——sinatra 没有默认识别 mustache 模板引擎。原来有人创造了一个超级简单的 gem 来让它工作,sinatra-mustache。您只需包含 gem 并需要库:

require 'sinatra/mustache'

就是这样 - 它只是工作!无需额外配置。如果你好奇它是如何工作的,源代码非常简单。用 sinatra 注册一个新的模板引擎绝不是一条线(甚至说“注册”是用词不当——你基本上必须实现它),但它仍然相当简单。

更新:此 gem 缓存给定请求/模板的输出,因此您不能在不同的本地人中再次使用它。我可以看到没问题的情况,但这对我的用例来说毫无价值。

于 2012-11-09T17:20:35.413 回答