创建视图

虽然通过对 Controller 内的所有内容进行编码来创建整个应用程序是可能的,但最终会出现一些非常难看的网页。要应用更多格式,您需要创建一个视图(View)。

你可以将视图(View)视为 HTML 页面,当有人登录到特定的 Web 地址时将显示该页面 - 在这种情况下,视图的名称构成了地址的最后部分,如前面的示例所示 URL 的 /index/bye 部分将为我们匹配相应视图,这些视图显示的数据由控制器中的 indexbye 方法提供。

你可以创建与这些 Web 地址和相应方法名称匹配的 HTML 视图“模板”。使用 HTML(或纯文本)编辑器,在 \app\views\say_hello 目录中创建名为 index.html.erb 的文件。

请记住,在最初生成控制器时,你可以选择创建一个或多个视图模板。这是通过在用于运行脚本以生成控制器的命令末尾附加几个名称来完成的: ruby script/generate controller Blather index bye snibbit这个脚本将创建 Blather 控制器和三个视图:indexbyesnibbit。现在我们有了一个视图模板,我们可以对其进行编辑,以便控制数据在网页中的显示方式。这意味着从现在开始我们不需要使用控制器中的 render 方法显示简单,无格式的文本。

但是,由于视图不受控制器的控制(可以这么说),控制器如何将数据传递给视图?事实证明,它可以通过将数据分配给实例变量来实现。

编辑 say_hello_controller.rb 中的代码(或删除它并粘贴来自文件 sayhello2.rb 中我的代码),使其与以下内容匹配:

sayhello2.rb
  1. class SayHelloController < ApplicationController
  2. def showFamily( aClass, msg )
  3. if (aClass != nil) then
  4. msg += "<li>#{aClass}</li>"
  5. showFamily( aClass.superclass, msg )
  6. else
  7. return msg
  8. end
  9. end
  10. def index
  11. @class_hierarchy = "<ul>#{showFamily( self.class, "" )}</ul>"
  12. end
  13. 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 文件中添加:

  1. <h1></h1>
  2. <%= @class_hierarchy %>

第一行只是纯 HTML 格式,它将 <h1></h1> 标记所包含的文本定义为标题。下一行更有趣。它包含变量 @class_hierarchy。回顾一下 say_hello_controller.rb 中的 index 方法,你会发现这是我们为其分配字符串的变量。在视图中,@class_hierarchy 位于两个奇怪的限定符 <%=%> 两者之间。这些是特殊的 Rails 标签。它们用于嵌入 Ruby 代码,这些 Ruby 代码将在浏览器中显示网页之前被执行。最终显示的页面将是一个完整格式的 HTML 页面,其中包含视图模板文件中的任何HTML片段以及任何嵌入式 Ruby 代码执行后的结果。现在尝试一下,在浏览器中输入页面地址:

  1. http://localhost:3000/say_hello/

现在,它应该以粗体字母显示标题 “This is the Controller’s Class Hierarchy”,后跟一个类列表,每个类的前面都有一个点:

  • SayHelloController
  • ApplicationController
  • ActionController::Base
  • Object

如果你愿意,从视图文件中删除所有 HTML,可以通过在控制器中创建标题并将结果字符串分配给另一个变量。你可以通过编辑 say_hello_controller.rb 中的 index 方法来执行此操作:

  1. def index
  2. @heading = "<h1>This is the Controller's Class Hierarchy</h1>"
  3. @class_hierarchy = "<ul>#{showFamily( self.class, "" )}</ul>"
  4. end

然后将视图文件(/app/views/say_hello/index.html.erb)编辑为:

say_hello.html.erb
  1. <%= @heading %>
  2. <%= @class_hierarchy %>

如果执行此操作,则网页中显示的最终结果将保持不变。