Ruby 如何使用Sinatra获得液体模板部分(包括)?

Ruby 如何使用Sinatra获得液体模板部分(包括)?,ruby,include,sinatra,liquid,partials,Ruby,Include,Sinatra,Liquid,Partials,我是ruby新手,我正在尝试让模板部分在我的Sinatra+Liquid项目中工作 我的/includes目录中有几个模板部分 如何使所有这些模板都作为液体部分工作,以便将它们与液体包含标记一起使用 我实际上做了什么: # Sinatra First App require 'sinatra' require 'sinatra/config_file' require 'liquid' config_file 'config.yml' # WebRick set :run, true set

我是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>

{%include'头'%}
{{title}}
{{content}}
下面是标题部分模板:

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

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

{{title}}

我怎样才能修好它?感谢您的回复。

对于
获取“/”
路径,我认为第一行应该在配置块中,第二行应该根本不需要,因为Tilt/Sinatra应该负责调用
渲染
,例如

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
或者,如果您想要一个视图目录,其中包含部分/includes等的子目录,例如
“/views/includes”
,您可以将视图文件夹作为选项传递,例如

get '/' do
  liquid :index, :locals => { :title => "My Sinatra App"}, :views => File.join(File.dirname(__FILE__),'views/includes') 
end
或者你可以试试(我是维护者)


由于上面的操作不起作用(请参见注释),我查看了并使用了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>
。/app.rb
#西纳特拉第一应用程序
需要“sinatra”
需要'sinatra/config_文件'
需要“液体”
配置文件'config.yml'
配置do
#韦布里克
设定:跑,真的
设置:服务器%w[webrick]
#应用程序路径
set:root,File.dirname(_文件_;)
set:views,File.dirname(+uuuuu文件)+'/views'
集合:Controllers,File.dirname(_File__;)+'/Controllers'
set:public_文件夹,Proc.new{File.join(root,“static”)}
Liquid::Template.file\u system=Liquid::LocalFileSystem.new(file.join(file.dirname(\uuuuu file\uuuu),'views/includes'))
结束
获取“/”do
液体:索引,:locals=>{:title=>“我的Sinatra应用程序”}
结束
获取“/test”do
“这是测试页。”
结束
#/Gemfile
来源“https://rubygems.org"
宝石“西纳特拉”
宝石“液体”
宝石“sinatra contrib”
#/视图/包括/_标题。液体
{{title}}
#./views/index.liquid
{{title}}
{{content}}
#/视图/layout.liquid
{%include“header”%}
{{yield}}

你读过吗?是的,我读过。还有一本书,但镜子已经死了。谢谢你的评论,我是新手,我仍然不知道怎么做。你的解决方案也不管用。当我更改views文件夹时,它不会解析液体部分,只会说:液体错误:此液体上下文不允许包含。所以我认为应该包括Liquid::LocalFileSystem。也许我应该创建一个完整的类或者一些带有read方法的猴子补丁来访问部分。但是当我将正确的路径传递到liquid文件系统时,它应该会工作,不是吗?@yell0wgh0st我已经用对我有用的东西更新了答案。太棒了,它工作了。我现在明白多了。谢谢!