Ruby on Rails如何“content_for:title”获得稍后分配的内容?

时间:2010-11-07 18:12:07

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

简短的问题是:子页面如何

<% content_for :title do 'Showing product' end %>

为主要布局设置:title


细节:

我们可以在应用程序布局application.html.erb

中使用
<title><%= content_for :title %>
  ...
  <%= yield %>

我认为yield会返回子页面的内容,例如来自show.html.erb的内容,其中包含:

<% content_for :title do 'Showing product' end %>

:title如何以某种方式被yield以上的某些东西使用?我认为首先评估title部分,然后评估yield,那么:title如何追溯设置<title>代码的内容?

2 个答案:

答案 0 :(得分:8)

简短回答:作弊。

很长的回答:ActionView重新定义了产量,因此它与我们所知道的产品不同,并且非常喜欢好的'红宝石'。实际上,模板文件在布局文件之前呈现,然后布局文件中的yield将被已呈现的模板替换。 content_for块保存在类变量中,因此您可以稍后从布局中访问它们。

答案 1 :(得分:5)

我在title文件中定义了一个帮助方法application_helper.rb,如下所示:

module ApplicationHelper
  def title(page_title)
    content_for(:title){ page_title }
    page_title
  end
end

然后在我的内容ERB文件的顶部,我可以这样做

<% title "Rails Rocks" %>
Other regular content

application.html.erb

<html>
<head>
  <% title = yield(:title).chop! %>
  <title><%= title || 'Default Title' %></title>
</head>
<body>
  <h1 class="title"><%= title %></h1>
</body>