Ruby 如何使用Sinatra获得液体模板部分(包括)?
我是ruby新手,我正在尝试让模板部分在我的Sinatra+Liquid项目中工作 我的/includes目录中有几个模板部分 如何使所有这些模板都作为液体部分工作,以便将它们与液体包含标记一起使用 我实际上做了什么: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
# 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我已经用对我有用的东西更新了答案。太棒了,它工作了。我现在明白多了。谢谢!