2

我正在尝试向应用程序布局添加布局。我在尝试找出所有不同的布局解决方案时遇到了麻烦。首先,我只尝试了布局内的布局,因为我没有完全掌握部分是什么,或者它们是否也是布局?也许我可以从这个问题开始。布局和局部有什么区别。

这是我现在所拥有的。我正在尝试将具有导航和其他一些元素的标题代码分离到单独的布局中。我希望这个布局出现在所有视图上。这意味着它应该是应用程序布局内的布局,以及在调用其控制器时调用的其他视图。我的代码中包含 <%= yield %>。该产量有效,但 :header 无效。

应用程序布局 app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>home</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>
    <div id="header"><%= yield(:header) %></div> 
    <%= yield %>
</body>
</html> 

标题布局 app/views/layouts/application.html.erb

<% content_for :header %>
    <p>HEADER TEXT</p>
<% end %>

为什么上面的代码不起作用?

我也看到了我尝试过的这样的代码,但它给了我一个错误。

<%= render layouts/header %>

有人可以解释所有这些不同的方法。谢谢。

4

3 回答 3

1

<% content_for :header do %>
    <p>HEADER TEXT</p>
<% end %>

你忘了do

于 2012-12-03T22:30:48.617 回答
1

最好将页眉和页脚分成部分,您将分别作为“_header.html.erb”和“_footer.html.erb”存在于视图/布局文件夹中。

然后,您可以选择用特定的 div 包装每个部分,这是您尝试对标头执行的操作(您也可以对主体执行相同的操作),它最终看起来像这样:

<!DOCTYPE html>
<html>
<head>
  <title>home</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>

    <div id="header">
      <%= render 'layouts/header' %>
    </div> 
    <%= yield %>

    <div id="footer">
     <%= render 'layouts/footer' %>
    </div>
</body>
</html> 

这将做你想做的事。

请注意,'layouts/header' 和 'layouts/footer' 周围有 ''。

要回答您关于布局和部分之间有什么区别的问题,布局是在整个应用程序中使用的东西,例如一致的页眉或页脚。部分可以是布局,但并非必须如此,因此您可以部分特定于您网站上的其他视图。

于 2012-12-03T22:50:57.970 回答
0

所以 - 首先 - yield 语法可能正确也可能不正确,但我从未见过它,而且我不喜欢它。我只在文件中调用一次 yield 。

如果你想在你的应用程序模板文件中呈现一个标题,那当然是可能的——我的建议是直接将它放在你的模板文件中——毕竟,这就是模板文件的用途。如果您出于某种原因想将您的标头完全封装在单独的文件中,您需要的是部分文件。你要做这样的事情:

<body>
    <%= render :partial => "shared/header" %>
    <%= yield %>
</body>

这会将存储在 /shared/_header.html.erb 中的标题内容呈现到此处的布局中。

在此处查看本指南以获取更多信息

于 2012-12-03T22:56:54.237 回答