Как Ruby on Rails использует доходность для макетов?
yield используется для вызова блока. Как это работает в Rails, где yield используется для макетов?
-# application.html.haml
%body= yield
Использует ли он блоки где-то или метод просто переопределен?
Ответ 1
Технически, yield также вызывает блок в этом контексте. Тем не менее, этот блок - это представление, которое вашему контроллеру было предложено выполнить.
Например, скажем, у вас есть StaticContentController, на котором есть действие index, которое представляло вашу домашнюю страницу. Если маршруты настроены правильно, вы заходите на свою домашнюю страницу. Rails загрузит файл макета в views/layouts, который подходит для этого контроллера (application.html.haml, если вы не переопределите это с помощью макета для своего контроллера). Когда он достигает команды yield, он вставляет представление в views/static_content/index.html.haml в том месте, где yield находится внутри вашего макета. Затем он загружает остальную часть вашего файла макета.
Ответ 2
По умолчанию всем функциям Ruby может быть передан блок:
def twice
yield
yield
end
> twice { print 'hi ' }
=> hi hi
Лучший способ думать о макете - это метод, вызываемый блоком.
Когда Rails создает шаблон, он фактически вызывает вызов Layout # render. Макет # render принимает блок по умолчанию. По умолчанию Rails передает ваше представление в виде этого блока. Это означает, что вызов выхода из вашего макета походит на вызов блока по умолчанию, который в этом случае является вашим представлением.