创建视图
虽然通过对 Controller 内的所有内容进行编码来创建整个应用程序是可能的,但最终会出现一些非常难看的网页。要应用更多格式,您需要创建一个视图(View)。
你可以将视图(View)视为 HTML 页面,当有人登录到特定的 Web 地址时将显示该页面 - 在这种情况下,视图的名称构成了地址的最后部分,如前面的示例所示 URL 的 /index 和 /bye 部分将为我们匹配相应视图,这些视图显示的数据由控制器中的 index
和 bye
方法提供。
你可以创建与这些 Web 地址和相应方法名称匹配的 HTML 视图“模板”。使用 HTML(或纯文本)编辑器,在 \app\views\say_hello 目录中创建名为 index.html.erb 的文件。
render
方法显示简单,无格式的文本。但是,由于视图不受控制器的控制(可以这么说),控制器如何将数据传递给视图?事实证明,它可以通过将数据分配给实例变量来实现。
编辑 say_hello_controller.rb 中的代码(或删除它并粘贴来自文件 sayhello2.rb 中我的代码),使其与以下内容匹配:
class SayHelloController < ApplicationController
def showFamily( aClass, msg )
if (aClass != nil) then
msg += "<li>#{aClass}</li>"
showFamily( aClass.superclass, msg )
else
return msg
end
end
def index
@class_hierarchy = "<ul>#{showFamily( self.class, "" )}</ul>"
end
end
此版本调用 showFamily()
方法,以便在两个 HTML’无序列表’标记 <ul>
和 </ul>
中构建一个字符串。每次找到类名时,它都放在两个 HTML ‘列表项’标签 <li>
和 </li>
之间。完整的字符串形成一个有效的 HTML 片段,index
方法只是将该字符串分配给一个名为 @class_hierarchy
的变量。
控制器中的 HTML 标记…?
一些 Ruby On Rails 开发人员反对在控制器(Controller)代码中包含任何 HTML 标记,无论多少。在我看来,如果你打算在网页中显示最终结果,那么你把奇怪的<p>
,<ul>
或 <li>
标签放在哪里就没那么重要了。虽然 MVC 模式鼓励控制器(Controller)的程序代码与视图(View)的布局定义之间存在强烈的可拆分性,但你将不可避免地要做出一些妥协 - 至少可以通过将一些程序代码放入视图(View)中来实现。避免在控制器(Controller)中使用 HTML 标签在很大程度上是一种美学而非实用的反对意见。我个人对这个问题没有非常强烈的看法,但是(被警告!)其他人这样做…我们现在需要做的就是找到一种方法将 HTML 片段放入一个完整组成的 HTML 页面。这就是视图(View)的用处。在 app/views/say_hello 文件夹中打开刚刚创建的视图文件 index.html.erb。根据 Rails 命名约定 - 这是与 say_hello_controller.rb 文件关联的默认视图(’index’页面)。由于 Rails 根据文件,文件夹,类和方法名称计算出依赖关系,因此我们不必按名称加载(load)或引入(require)任何文件,也不必编写任何详细配置信息。
在 index.html.erb 文件中添加:
<h1></h1>
<%= @class_hierarchy %>
第一行只是纯 HTML 格式,它将 <h1></h1>
标记所包含的文本定义为标题。下一行更有趣。它包含变量 @class_hierarchy
。回顾一下 say_hello_controller.rb 中的 index
方法,你会发现这是我们为其分配字符串的变量。在视图中,@class_hierarchy
位于两个奇怪的限定符 <%=
和 %>
两者之间。这些是特殊的 Rails 标签。它们用于嵌入 Ruby 代码,这些 Ruby 代码将在浏览器中显示网页之前被执行。最终显示的页面将是一个完整格式的 HTML 页面,其中包含视图模板文件中的任何HTML片段以及任何嵌入式 Ruby 代码执行后的结果。现在尝试一下,在浏览器中输入页面地址:
http://localhost:3000/say_hello/
现在,它应该以粗体字母显示标题 “This is the Controller’s Class Hierarchy”,后跟一个类列表,每个类的前面都有一个点:
- SayHelloController
- ApplicationController
- ActionController::Base
- Object
如果你愿意,从视图文件中删除所有 HTML,可以通过在控制器中创建标题并将结果字符串分配给另一个变量。你可以通过编辑 say_hello_controller.rb 中的 index
方法来执行此操作:
def index
@heading = "<h1>This is the Controller's Class Hierarchy</h1>"
@class_hierarchy = "<ul>#{showFamily( self.class, "" )}</ul>"
end
然后将视图文件(/app/views/say_hello/index.html.erb)编辑为:
<%= @heading %>
<%= @class_hierarchy %>
如果执行此操作,则网页中显示的最终结果将保持不变。