如何使用Ruby和ERB(而不是Rails)的视图和布局?
今天我使用此代码渲染我的观点:
def render(template_path, context = self)
template = File.read(template_path)
ERB.new(template).result(context.get_binding)
end
这非常有效,但是我如何实现相同的功能,但是在布局中呈现模板?我想调用render_with_layout(template_path,context = self),以便它具有默认布局。
答案 0 :(得分:4)
因为你用Sinatra标记它,我假设你是Sinatra。
默认情况下,您的视图将在名为layout.erb
的默认布局中呈现get "/" do
erb :index
end
这会使您的视图索引呈现默认布局。
如果您需要多个布局,可以指定它们。
get "/foo" do
erb :index, :layout => :nameofyourlayoutfile
end
*如果您不使用Sinatra,您可能需要从那里借用代码。
答案 1 :(得分:2)
如果你正在使用Sinatra,那么它有一个很好的文档和它的嵌套布局的主题之一(见Sinatra README)
在视图目录中使用特殊默认布局文件(布局 .haml或布局 .erb)也是个好主意。此文件将始终用于渲染其他文件。这是layout.haml的示例:
!!!5
%html
%head
##<LOADING CSS AND JS, TILE, DESC., KEYWORDS>
%body
=yield ## THE OTHER LAYOUTS WILL BE DISPALYED HERE
%footer
# FOOTER CONTENT
答案 2 :(得分:2)
如果您使用Tilt gem(我认为是Sinatra使用的),您可以执行类似
的操作template_layout = Tilt::ERBTemplate.new(layout)
template_layout.render {
Tilt::ERBTemplate.new(template).render(context.get_binding)
}
答案 3 :(得分:2)
感谢所有答案!
我最终解决了这个问题,我希望其他人也能找到这个代码有用:
def render_with_layout(template_path, context = self)
template = File.read(template_path)
render_layout do
ERB.new(template).result(context.get_binding)
end
end
def render_layout
layout = File.read('views/layouts/app.html.erb')
ERB.new(layout).result(binding)
end
我称之为:
def index
@books = Book.all
body = render_with_layout('views/books/index.html.erb')
[200, {}, [body]]
end
然后它将使用硬编码(目前为止)布局呈现我的视图..