Rails:使用"Content_for"来区分"Yield"的正确方法?



我有一个Rails应用程序,在这个应用程序中,我将整个网站放入一个980宽的容器中,在我的"application.html.erb"文件中有以下代码:

<div class="container_980 white shadow-horizontal">
<div class="container">
<%= render 'layouts/flashes' %>
<%= yield %>
</div>
</div>

现在,我想对容器中的内容进行2个文件例外处理。我希望索引页面和另一个页面在整个页面上展开,所以我需要在上面的通用"yield"集合之外获得这两个页面。

我试过这样做:

<% if current_page?(root_url) %>
<%= yield :index %>
<% elsif current_page?(:controller => "tracks", :action => "show", :id => params[:id])) %>
<%= yield :show_track %>  
<% else %>
<div class="container_980 white shadow-horizontal">
<div class="container">
<%= render 'layouts/flashes' %>
<%= yield %>
</div>
</div> 

<% content_for :show_track do %>
blah blah blah 
<% do %>

问题:show_track页面没有加载。我做了一些搜索,上面的方法似乎应该有效,但事实并非如此,我想知道是否需要做其他事情,因为"展示"页面是通过脚手架(RESTful)制作的。

有没有比使用if.else条件更好的方法从容器中取出2页?

有没有比使用if.else条件更好的方法从容器中取出这两页?

这是主观的,但我会使用嵌套布局,然后在控制器中为每个页面类型定义布局。

首先是基本的顶层布局。我称之为"应用程序",默认情况下,但您可以将其称为任何名称。注意,如果有content_for? :application,它将如何产生它,否则它只会产生。这是设置的关键。所有嵌套布局都应遵循类似的模式;通过这种方式,它们可以呈现更多嵌套的子布局,或者用作布局本身。

<!-- layouts/application.html.erb -->
<html>
<body>
<%= content_for?(:application) ? yield(:application) : yield %>
</body>
</html>

然后,对于容器,您可以定义可以嵌套在"应用程序"中的布局,这一布局设置了容器HTML并在其中呈现内容。

<!-- layouts/container.html.erb -->
<%= content_for :application do %>
<div class="container_980 white shadow-horizontal">
<div class="container">
<%= render 'layouts/flashes' %>
<%= content_for?(:container) ? yield(:container) : yield %>
</div>
</div>
<% end %>
<%= render :file => "layouts/application" %>

然后把你的条件逻辑移到控制器上,比如:

layout :determine_layout
protected
function determine_layout
# pseudocode here, you get it
(index or tracks) ? "application" : "container"
end

你可以停在那里。继续查看如何进一步嵌套布局

但是,您可以更进一步,使用嵌套布局设置来嵌套任意数量的不同布局。例如,假设曲目有另一个需要填充的内容块。您可以定义另一个嵌套布局,如:

<!-- layouts/tracks.html.erb -->
<%= content_for :some_other_block do %>
// stuff that should be in some other block
<% end %>
<%= content_for :container do %>
// stuff that should be in the container
<% end %>
<%= render :file => "layouts/container" %>

然后在控制器中,您可以更改determine_layout以设置轨道的"轨道"布局,例如:

function determine_layout
# pseudocode here, you get it
if index
"application"
elsif tracks
"tracks"
else
"container"
end
end

最新更新