【问题标题】:How to render Mustache partials in Sinatra while using ERB as the primary tempate engine如何在使用 ERB 作为主要模板引擎时在 Sinatra 中呈现 Mustache 部分
【发布时间】:2012-11-09 00:02:21
【问题描述】:

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

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

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

get '/' do
    erb :index
end

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

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

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

找不到模板引擎:小胡子

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

我正在通过包含此配置来设置我的视图目录:

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

版本号:

  • sinatra 1.3.1
  • 小胡子 0.99.4
  • 红宝石 1.9.3

【问题讨论】:

    标签: ruby views sinatra template-engine mustache


    【解决方案1】:

    因此,我的其他答案中的解决方案中列出的 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'), { ... }) %>
    

    这非常适合我的用例。

    【讨论】:

      【解决方案2】:

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

      require 'sinatra_more/render_plugin'
      
      module Sinatra
          register SinatraMore::RenderPlugin
      end
      

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

      require 'sinatra/mustache'
      

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 2012-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多