Как Ruby on Rails использует yield для макетов? - PullRequest
19 голосов
/ 01 февраля 2011

yield используется для вызова блока.Как это работает в Rails, где yield используется для макетов?

-# application.html.haml
%body= yield

Использует ли он где-нибудь блоки или метод просто переопределен?

Ответы [ 2 ]

19 голосов
/ 01 февраля 2011

Технически, yield также вызывает блок в этом контексте.Тем не менее, блок - это представление, которое вашему контроллеру было приказано визуализировать.

Например, предположим, у вас есть StaticContentController с действием index, которое представляет вашу домашнюю страницу.Если маршруты настроены правильно, вы заходите на свою домашнюю страницу.Rails загрузит файл макета в views/layouts, который подходит для этого контроллера (application.html.haml, если вы не переопределите это макетом для вашего контроллера).Когда он достигает команды yield, он вставляет представление в views/static_content/index.html.haml в то место, где yield находится внутри вашего макета.Затем он загружает оставшуюся часть файла макета.

8 голосов
/ 01 февраля 2011

По умолчанию все функции Ruby могут быть переданы блоку:

def twice
  yield
  yield
end

> twice { print 'hi ' }
=> hi hi

Лучший способ думать о компоновке - это метод, который вызывается с блоком.

Когда рендеринг Railsшаблон, он на самом деле делает вызов Layout # render.Layout # render принимает блок по умолчанию.По умолчанию Rails передает ваш вид как этот блок.Это означает, что вызов yield из вашего макета аналогичен вызову блока по умолчанию, который в данном случае является вашим представлением.

...