0

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

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

现在,我想创建 2 个文件例外来适应容器内的内容。我希望索引页面和另一个页面扩展到整个页面,所以我需要将这两个页面放在上面设置的常见“产量”之外。

我尝试这样做:

  <% 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 页?

4

1 回答 1

2

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

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

首先是您的基本顶级布局。我将其称为“应用程序”,这是默认设置,但您可以随便称呼它。注意如果有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
于 2012-11-24T01:51:38.643 回答