2012-12-03 57 views
1

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

这是我现在所拥有的。我试图将具有导航和其他元素的头文件代码分离出来,放在单独的布局中。我希望这种布局适合所有视图。这意味着它应该是应用程序布局中的布局以及调用其控制器时调用的其他视图。我的代码中涵盖了<%= yield%>。该yeild工程,但:头一个没有。

应用程序布局应用程序/视图/布局/ 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> 

头布局应用程序/视图/布局/ application.html.erb

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

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

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

<%= render layouts/header %> 

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

+1

我有同样的问题与产量及content_for:(我包括DO ...见下文)。我使用Rails 4.它困扰我,即使在Rails 4中,API指南中的某些内容也不起作用。 – user1743524

回答

0

这是你的页眉和页脚分成,你将生活在视图/布局文件夹“_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'在它们周围有''。

要回答你关于布局和局部之间有什么区别的问题,那么布局就是在整个应用程序中使用的东西,比如一致的页眉或页脚。部分可以是布局,但不一定是,所以您可以部分特定于整个网站的其他视图。

+0

谢谢jfdimark。 “布局是将在整个应用程序中使用的东西”。这就是我在整个应用程序中使用标题的原因。根据你的回答,我应该使用一个布局而不是局部?那么,如何在应用程序布局中使用布局,就像我在代码中所做的那样。再次感谢您的帮助。 – Chapsterj

+0

只需在views/layouts文件夹中保存部分'_header.html.erb',然后将其包含在'application.html.erb'文件中,如上所示。这真的是一个权威的指南,了解它的一切:http://guides.rubyonrails.org/layouts_and_rendering.html。希望你能得到它的工作。 – jfdimark

+0

得到它的工作感谢。仍然不理解布局,因为根据你的答案“很好的布局是将在整个应用程序中使用的东西”,使用布局而不是部分更合理,因为我希望它在整个应用程序中都显示出来。或者我读错了你的答案。 – Chapsterj

1

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

你忘了do

+1

如果我使用do或不使用,它仍然不起作用。 – Chapsterj

+0

我很确定你不想从同一个文件中包含这个人。只需放置文本,无论如何它都会渲染得更快。如果你正试图把默认的文本或某些东西用于三元组。 – pjammer

+0

哦,有一个答案。纳米。 – pjammer

0

所以 - 首先 - 产量语法可能是也可能不是正确的,但我从来没有见过它,我不喜欢它。我只在文件中称过收益率一次。

如果你想在应用程序模板文件中渲染一个头文件,这当然是可能的 - 我的建议是直接将它放在你的模板文件中 - 毕竟,这就是模板文件的用途。如果你想以某种原因完全封装你的头文件在单独的文件中,你需要的是partials。你会做这样的事情:

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

这会使你的头的内容,存储在/shared/_header.html.erb到布局这里。

退房this guide here更多信息

+0

/shared /文件夹的含义在哪里? – Chapsterj

+0

您是否还需要将_header.html.erb文件中的html代码换成<% %>标签? – Chapsterj

+0

共享文件夹应位于您的视图文件夹中,因此/ app/views/shared /。 至于包装 - 好吧,_header.html.erb是一个视图,就像任何其他视图一样,应该写成一个视图。 – mschultz