tl;博士:在Sinatra中有一种简洁的方法来嵌套布局吗?
对于我网站上的所有页面,我有一个共同的layout.erb,它会呈现页眉,页脚和其他位。
对于这些页面的子集,我想使用内部布局,除了这些公共位之外还会显示左侧菜单。
erb :pageTemplate
执行layout.erb,其中yield
执行pageTemplate
erb :pageTemplate
执行layout.erb,其中yield
执行specificLayout.erb,其中yield
执行pageTemplate。
有意义吗?
我愿意分开课程,在陈述之前,以及任何其他红宝石魔法。我不是在寻找添加页眉/页脚部分并将它们包含在每个布局中。
答案 0 :(得分:10)
erb :site_layout, :layout => false do
erb :region_layout do
erb :page
end
end
现在,:site_layout
可以包含页眉和页脚,:region_layout
可以包含左侧导航,:page
只需要担心页面内容!
答案 1 :(得分:4)
erb :pageTemplate
子集中的erb :pageTemplate, :layout => :specificLayout
编辑:
一种方法是使用部分,通过Erb或Sinatra Partial(我是维护者,我没有为这个广告赚钱;)
将标志传递给影响渲染的布局:
<html>
<head>
<title>Example</html>
</head>
<body>
<%= erb @specificLayout if @specificLayout %>
<%= yield %>
</body>
</html>
在路线中:
@specificLayout = :left_menu
如果您认为一大堆路由需要相同的标志,那么一些继承会有所帮助:
# one big config.ru
require 'sinatra/base'
class MainController < Sinatra::Base
configure do
# lots of shared settings here
enable :inline_templates
set :specificLayout, nil
end
helpers do
# all subclasses get these too
def route
request.path
end
end
get "/" do
erb :home
end
end
class SubWithLeftMenu < MainController
configure do
set :specificLayout, :left_menu
end
get "/" do
erb :something
end
end
map( "/something" ) { run SubWithLeftMenu }
map( "/" ) { run MainController }
__END__
@@ layout
<html>
<head>
<title>Example</title>
</head>
<body>
<p>Route: <%= route %></p>
<%= erb settings.specificLayout if settings.specificLayout %>
<%= yield %>
</body>
</html>
@@ something
<p>Hello!</p>
@@ home
<p>At home</p>
@@ left_menu
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
运行它:
$ bin/rackup config.ru &
[1] 40556
[2013-06-21 22:16:34] INFO WEBrick 1.3.1olumes/RubyProjects/Test/nestinglayouts
[2013-06-21 22:16:34] INFO ruby 1.9.3 (2013-02-06) [x86_64-darwin10.8.0]
[2013-06-21 22:16:34] INFO WEBrick::HTTPServer#start: pid=40556 port=9292
$ curl http://localhost:9292/
127.0.0.1 - - [21/Jun/2013 22:16:47] "GET / HTTP/1.1" 200 99 0.0399
<html>
<head>
<title>Example</title>
</head>
<body>
<p>Route: /</p>
<p>At home</p>
</body>
</html>
$ curl http://localhost:9292/something/
127.0.0.1 - - [21/Jun/2013 22:16:51] "GET /something/ HTTP/1.1" 200 141 0.0064
<html>
<head>
<title>Example</title>
</head>
<body>
<p>Route: /something/</p>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<p>Hello!</p>
</body>
</html>