如何使用Ruby和ERB(而不是Rails)的视图和布局?

时间:2014-09-08 19:17:57

标签: ruby sinatra erb rack

如何使用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),以便它具有默认布局。

4 个答案:

答案 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

然后它将使用硬编码(目前为止)布局呈现我的视图..