Rails:使用“Content_for”纠正“Yield”例外的方法吗?

时间:2012-11-24 01:22:37

标签: ruby-on-rails ruby ruby-on-rails-3 layout containers

我有一个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页?

1 个答案:

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