模板继承【粗翻译】

原文来自:http://asciicasts.com/episodes/269-template-inheritance 的前半部分。

    模板的继承是Rails3.1中的一个新功能。这功能并没有革命性的改变你写视图的方式,不管怎么样,它是一种值得使用并且有用的新功能,在这里,我讲展示给你看,它是怎么样工作的。

    为了讲述的需要,我们的初始拥有的应用在每个页面上使用相同的导航。

这里使用的导航是定义在application layout中的静态的id为side的div元素。

模板继承【粗翻译】_第1张图片

我们想要依据当前不同的控制器自行选择匹配的导航。这里有很多种方法可以实现,我们将要使用的是模板继承。首先,我们把导航移动到一个命名为“side”的partial中。

为了让每个控制器都能访问到这个partial,我们将把它放置在那里呢?我们可以在视图目录下创建一个shared的子目录存放它,或者将它放置在layouts目录下面,但是,在Rails3.1中,我们可以将它放置视图目录下的application子目录中。这个目录在Rails3.1中的application目录默认不存,所以我们需要手动创建它。

模板继承【粗翻译】_第2张图片

这时side partial可以被所有的控制器使用,原理是伴随着控制器继承,视图同样被继承下去。所有的controllers继承自ApplicationController,所以所有的模板将被继承自应用这个目录。

如果我们装载我们应用的一个页面,这时导航还是如同先前一样运作。

这时,我们可以很容易地在各个控制器中重载partial。我们需要做的就是在另一个控制器的视图目录下面创建一个_side.html.erb。这里我们为ProductsController创建多一个链接的一个partial。

模板继承【粗翻译】_第3张图片

如果我们重新载入ProductsController下的任意页面,我们将能看到新的链接。这里查看其他控制器下的页面,还是使用默认的导航。

我们现在有一个标准的位置,在这里我们可以将控制器之间共享模板,我们可以在适当的控制器的视图目录创建一个相同的名称视图模板来实现重载。

这种方法同样适合命名空间嵌套的控制器。我们的应用会在Admin命名空间下创建有多个控制器,所有这一切都可以从命名空间下的BaseController继承。

我们同样可以重载在此Base视图的模板。如果我们在上面的页面中单击“Manage Products” 链接定向到/admin/products页面 将返回到使用默认的导航。如果我们要重载所有的管理页面的导航,我们需要做些什么?

在/app/views/admin目录下有一个base目录。我们可以在这里放置的模板,它们会自动被其他控制器继承。这里我们将添加另一个链接,以区别于被重载的模板。

模板继承【粗翻译】_第4张图片

如果我们重新载入admin/products页面,我们将能看到已配置的来自于base目录的模板。

所有从Admin命名空间的BaseController继承的任何页面将显示此模板。

模板继承不仅是作用于partials而且同样适合视图下其他模板。在 app/views/admin的categories和products目录下都有一个edit.html.erb模板。它们包含着类似的代码。

如果我们将其中之一模板放到的base目录,并删除其他两个,控制器会从那里继承模板。这两个页面将仍然如同之前运行。这是一个非常有用的功能,如果我们创造了很多应用的管理页面。这些页面通常有大量重复的视图,通过使用这种技术,我们可以抽象这模板到base控制器中,在必要时在特定的控制器重载它们。

你可能感兴趣的:(template,Rails,inheritance,3.1)