如果您时常将不同 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



