Как Ruby on Rails "content_for: title" может получить что-то, что будет назначено позже? - PullRequest
5 голосов
/ 07 ноября 2010

Короткий вопрос: как может

<% 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 ]

8 голосов
/ 07 ноября 2010

Краткий ответ: обманывая.

Длинный ответ: ActionView переопределяет доходность, так что это не тот доход, который мы знаем и любим из хорошего старого рубина. Фактически файл шаблона визуализируется перед файлом макета, и тогда выход в файле макета будет заменен уже обработанным шаблоном. content_for блоки сохраняются в переменные класса, поэтому вы можете получить к ним доступ позже из макета.

5 голосов
/ 11 марта 2011

Я определил вспомогательный метод 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...