我有一个Rails应用程序,我将整个网站放入980width容器中,并在我的' application.html.erb'中使用以下代码:文件:
<div class="container_980 white shadow-horizontal">
<div class="container">
<%= render 'layouts/flashes' %>
<%= yield %>
</div>
</div>
现在,我想为容器内的内容拟合2个文件异常。我希望索引页面和另一个页面能够在整个页面中展开,所以我需要将这两个页面放在常见的&#39; yield&#39;之外。设置如上。
我试过这样做:
<% 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页面没有加载。我做了一些搜索,似乎上面的方法应该有效,但事实并非如此,我想知道我是否需要做其他事情作为&#34; show&#34;页面是通过scaffoldaing(RESTful)制作的。
有没有比使用if..else条件更好的方法从容器中取出2页?
答案 0 :(得分:2)
有没有比使用if..else条件更好的方法从容器中取出2页?
这是主观的,但我会使用嵌套布局,然后在控制器中定义每种页面类型的布局。
首先是您的基本顶级布局。我称之为“应用程序”,默认情况下,但你可以称之为“应用程序”。请注意如果content_for? :application
它会产生它,否则它将屈服。这是设置的关键。所有嵌套布局都应遵循类似的模式;通过这种方式,他们可以渲染更多嵌套的子布局,或者自己用作布局。
<!-- layouts/application.html.erb -->
<html>
<body>
<%= content_for?(:application) ? yield(:application) : yield %>
</body>
</html>
然后对于容器,您将定义可以嵌套在“application”中的布局,这个布局可以设置容器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