【问题标题】:How to get Liquid template partials (includes) working with Sinatra?如何让 Liquid 模板部分(包括)与 Sinatra 一起使用?
【发布时间】:2014-10-12 13:46:29
【问题描述】:

我是 ruby​​ 新手,我正在尝试让模板部分在我的 Sinatra + Liquid 项目中工作。

我的 /includes 目录中有几个模板部分。

我怎样才能让所有这些模板作为液体部分工作,以便我可以将它们与液体包含标签一起使用?

我实际上做了什么:

# Sinatra First App
require 'sinatra'
require 'sinatra/config_file'
require 'liquid'

config_file 'config.yml'

# WebRick
set :run, true
set :server, %w[webrick]

# App Paths
set :root, File.dirname(__FILE__)
set :views, File.dirname(__FILE__) + '/views'
set :controlers, File.dirname(__FILE__) + '/controlers'
set :public_folder, Proc.new { File.join(root, "static") }

# Includes Folder
includes = File.dirname(__FILE__) + '/includes'

get '/' do
    Liquid::Template.file_system = Liquid::LocalFileSystem.new(includes)
    Liquid::Template.parse(includes).render
    liquid :index, :locals => { :title => "My Sinatra App"}
end

get '/test' do
    "This is the test page."
end

但我仍然收到:液体错误:非法模板名称''。

这是我的索引模板:

<html>
    {% include 'header' %}
    <body>
        <h1>{{ title }}</h1>

        {{content}}
    </body>
</html>

这是标题部分模板:

<head>
    <title>{{ title }}</title>
</head>

我该如何解决?感谢您的每一个回复。

【问题讨论】:

标签: ruby include sinatra liquid partials


【解决方案1】:

在get '/' 路由中,在我看来,第一行应该在配置块中,而第二行根本不需要,因为 Tilt/Sinatra 应该负责调用render,例如

configure do
  set :views, File.join(File.dirname(__FILE__),'/includes')
  # or just put these in the views dir
end

get '/' do
  liquid :index, :locals => { :title => "My Sinatra App"}
end

或者,如果您想要一个包含部分/包含等子目录的视图目录,例如"./views/includes",您可以将视图文件夹作为选项传递,例如

get '/' do
  liquid :index, :locals => { :title => "My Sinatra App"}, :views => File.join(File.dirname(__FILE__),'views/includes') 
end

或者你可以试试Sinatra Partial(我是维护者)。


由于上述方法不起作用(参见 cmets),我查看了 Sinatra tests for Liquid 并使用了 OP 的代码。我发现以下内容对我有用:

# ./app.rb
# Sinatra First App
require 'sinatra'
require 'sinatra/config_file'
require 'liquid'

config_file 'config.yml'

configure do
  # WebRick
  set :run, true
  set :server, %w[webrick]

  # App Paths
  set :root, File.dirname(__FILE__)
  set :views, File.dirname(__FILE__) + '/views'
  set :controlers, File.dirname(__FILE__) + '/controlers'
  set :public_folder, Proc.new { File.join(root, "static") }
  Liquid::Template.file_system = Liquid::LocalFileSystem.new(File.join(File.dirname(__FILE__),'views/includes'))
end


get '/' do
  liquid :index, :locals => { :title => "My Sinatra App" }
end

get '/test' do
  "This is the test page."
end


#./Gemfile
source "https://rubygems.org"

gem "sinatra"
gem "liquid"
gem "sinatra-contrib"


#./views/includes/_header.liquid
<head>
    <title>{{ title }}</title>
</head>


#./views/index.liquid
<h1>{{ title }}</h1>

{{content}}


#./views/layout.liquid
<html>
    {% include "header" %}
    <body>
      {{ yield }}
    </body>
</html>

【讨论】:

  • 感谢您的评论,我是新手,但我仍然不知道该怎么做。您的解决方案也不起作用。当我更改视图文件夹时,它不会解析液体部分,只会说:液体错误:此液体上下文不允许包含。所以我认为应该包含 Liquid::LocalFileSystem 任何地方。也许我应该创建整个类或一些带有读取方法的猴子补丁来访问部分。但是当我将正确的路径传递给液体文件系统时,它应该可以工作,不是吗?
  • @yell0wgh0st 我已经用对我有用的方法更新了答案。
  • 太棒了,它有效。我现在明白了很多。谢谢!
猜你喜欢
  • 2011-01-20
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多