yield
用于调用块。在yield
用于布局的Rails中,这是如何工作的?
-# application.html.haml
%body= yield
它是否在某处使用了块,或者该方法是否被简单地覆盖了?
答案 0 :(得分:19)
从技术上讲,yield
也在此上下文中调用了一个块。但是,该块是控制器操作被告知要呈现的视图。
例如,假设您有一个StaticContentController
代表您的主页的index
操作。正确配置路由后,您将访问主页。 Rails将在views/layouts
中加载适合该控制器的布局文件(application.html.haml
,除非您使用控制器的布局覆盖它)。当它到达yield
命令时,它会将views/static_content/index.html.haml
处的视图插入布局中yield
所在的位置。然后,它加载你的布局文件的其余部分。
答案 1 :(得分:8)
默认情况下,所有Ruby函数都可以传递一个块:
def twice yield yield end > twice { print 'hi ' } => hi hi
考虑布局的最佳方法是使用块调用的方法。
当Rails呈现模板时,它实际上是在调用Layout#render。 Layout#render接受默认块。默认情况下,Rails会将您的视图作为此块传递。这意味着从布局中调用yield就像调用默认块一样,在这种情况下是您的视图。