【问题标题】:Nesting Layouts in Sinatra在 Sinatra 中嵌套布局
【发布时间】:2013-06-17 10:46:12
【问题描述】:

tl;dr:在 Sinatra 中是否有一种简洁的嵌套布局方式?

对于我网站上的所有页面,我有一个通用的 layout.erb,它呈现页眉、页脚和其他一些位。

对于这些页面的一个子集,我想使用一个内部布局,除了那些常见的位之外,它还呈现一个左侧菜单。

全局

erb :pageTemplate 执行 layout.erb,其中yield 执行 pageTemplate

在子集中

erb :pageTemplate 执行 layout.erb,其中yield 执行 specificLayout.erb,其中yield 执行 pageTemplate。


有意义吗?

我对单独的类、before 语句和任何其他红宝石魔法持开放态度。我不是在寻找添加页眉/页脚部分并将它们包含在每个布局中。

【问题讨论】:

  • 为什么不直接传入一个有条件地包含左侧菜单的配置标志呢?我认为通常宁愿选择愚蠢的观点,而不是从控制器那里窃取控制权。
  • 嘿@jacobangel!我想我最终会结合配置标志和部分来获得结果。最终,会有几个子集,每个子​​集都有自己的左侧菜单,所以我不想让主布局过于混乱。如果一个基本控制器可以有一个基本布局,那将是非常酷的,并且所有继承控制器都可以有它们的布局并从基本控制器继承。 npd,如果我想不出来的话。

标签: ruby sinatra erb


【解决方案1】:

找到了! http://www.sinatrarb.com/intro.html#Templates%20with%20%3Ccode%3Eyield%3C/code%3E%20and%20nested%20layouts

erb :site_layout, :layout => false do
  erb :region_layout do
    erb :page
  end
end

现在,:site_layout 可以包含页眉和页脚,:region_layout 可以包含左侧导航,:page 只需要担心页面内容!

【讨论】:

  • 回答您自己的问题 - 喜欢它!
【解决方案2】:

全局

erb :pageTemplate

在子集中

erb :pageTemplate, :layout => :specificLayout

编辑:

一种方法是通过 Erb 或 Sinatra Partial 使用 partials(我是维护者,我没有为这个广告赚钱;)

将标志传递给影响渲染的布局:

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

【讨论】:

  • 那不是只使用 specificLayout 吗?我想要 pageTemplate 包裹在 specificLayout 中,包裹在 globalLayout 中。
  • @PatNewell 是的。对不起,这就是我从你的问题中得到的。我会考虑最好的方法并更新我的答案。你有什么特别的理由反对偏音吗?
  • 感谢@iain。没有具体原因,嵌套布局概念只是感觉更干净。如果我不能这样做,我肯定会选择部分。
  • @PatNewell 我已经用我的想法更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多