Edge Rails 的更新: Partial 拥有了 Layout

Posted by yudi
on Thursday, December 27


如果您时常将不同 Rails views 中的重复代码放到 partials里,也许您也会察觉到我们还可以针对那些partials继续 DRY[1]。于是现在我们又有了一个新的工具来帮助 partials 成为 view-世界里的第一等公民: partial layout 。这个工具的使用正如同我们为 render call 中添加一个 :layout 选项般简单:

1
2
3
4
5
6
7
8
9
10
<!-- in posts/show.html.erb -->
<%= render :partial => 'header', :layout => 'boxed', :locals => {:post => @post} %>

<!-- in posts/_boxed.html.erb -->
<div class='box'>
  <div id='post_header_<%= post.id %>'><%= yield %></div>
</div>

<!-- in posts/_header.html.erb -->
<%= post.title %> published on <%= post.published_at %>

请注意叫做 ‘boxed’ 的partial layout依然保留了 _ 前缀的命名传统,并且这个 partial layout 也存在于同一个文件夹里 [2] 。同时,也请注意任何传入 partial render 的临时变量对于整个 partial layout 也会开放。(此例中是post)您将通过使用 yield 将 partial 的内容传递到 layout,正如您在 master templates 中所做的那样。

那么在上面的环境中,post/show.html.erb 的渲染结果将为:

1
2
3
<div class='box'>
  <div id='post_header_1'>Post Title published on August 3rd, 2007</div>
</div>

您也可以通过渲染 partial layout 中的部分代码块来保持 layout 个连贯性,从而不再需要把 content 分割成一份份的 partial:

1
2
3
4
<!-- in posts/show.html.erb -->
<% render(:layout => 'boxed', :locals => {:post => @post}) do %>
  <%= post.title %> published on <%= post.published_at %>
<% end %>

快进行您自己的 DRY 吧!

注脚

1DRY 即 Don’t Repeat Yourself (不要撰写重复的代码),是pragmatic programmer系列宣传的思想主旨

2它不不像其他的 master layouts 一般拥有自己的专属文件夹

原文作者是 Ryan Daigle, 请访问他的博客
本片译文的原文地址:http://ryandaigle.com/articles/2007/8/3/what-s-new-in-edge-rails-partials-get-layouts

Comments

Leave a response