创建控制器

如前所述,控制器(Controller)是你的大部分 Ruby 代码所在的位置。它是应用程序中视图(View,浏览器中显示的内容)和模型(Model,数据发生了什么改变)之间的一部分。这是一个 “Hello world” 应用程序,让我们创建一个控制器来说 “hello”。本着原创的精神,我将其称为 SayHello 控制器。再一次,你可以通过在系统提示符下运行脚本来创建它。你需要在先前运行服务器脚本的目录中打开另一个命令窗口(例如,C\railsapps\helloworld)。你无法重新使用现有的命令窗口,因为该命令窗口正在运行服务器,你需要将其关闭以返回到提示符 - 这将阻止我们的 Rails 应用程序工作!

在提示符下输入这个(使用 SayHello 的首字母大写方式,如下所示):

  1. ruby script/generate controller SayHello

片刻之后,你将被告知已创建以下文件和目录(该脚本还将告诉你某些目录已存在且因此未创建):

  1. app/views/say_hello
  2. app/controllers/say_hello_controller.rb
  3. test/functional/say_hello_controller_test.rb
  4. app/helpers/say_hello_helper.rb
注意:这个 generate controller 脚本还会创建另一个 Ruby 文件,application.rb,它是整个应用程序的控制器,加上一个文件夹 /views/say_hello,我们将在稍后使用它。

注意 Rails 如何将名称 SayHello 解析成两个小写的单词,say 和 hello,并用下划线分隔,它使用这个名字作为三个独立的 Ruby 文件的第一部分。这只是 Rails 使用的“按惯例配置”方法的一个示例。

这里的 Ruby 文件 say_hello_controller_test.rbsay_hello_helper.rb 作为存储库提供(如果你愿意),分别用于测试和实用程序(’helper’)代码。但更重要的是控制器文件本身 say_hello_controller.rb,它是在 \helloworld\app\controllers 中创建的。在文本编辑器中打开此文件。这个空方法已自动生成:

  1. class SayHelloController < ApplicationController
  2. end

在这个类中,我们可以编写一些代码,以便在显示某个页面时执行。编辑类定义以匹配以下内容:

  1. class SayHelloController < ApplicationController
  2. def index
  3. render :text => "Hello world"
  4. end
  5. def bye
  6. render :text => "Bye bye"
  7. end
  8. end

现在包含两个方法,indexbye。每个方法都包含一行代码。尽管我已经省略了括号(许多 Rails 开发人员喜欢使用 bracket-light 风格编码),但你可以推断出 render 是一种以哈希为参数的方法;哈希本身包含一个包含一个由符号和字符串构成的键值对。对于 bracket-lovers ,index 方法可以像这样重写:

  1. def index
  2. render( { :text => "Hello world" } )
  3. end

你有了第一个真正的 Rails 应用程序。要试用它,你需要返回到 Web 浏览器并输入你刚刚编写的两个函数的完整“地址”。但首先你可能需要重新启动服务器。只需在服务器运行的命令窗口中按 CTRL+C。当服务器存在时,输入以下命令重启:

  1. ruby script/server

现在输入一个地址来访问控制器方法。地址采用主机和端口的形式(与你之前输入的相同 - 例如,http://localhost:3000),加上控制器的名称(/say_hello),最后是特定方法的名称(/index/bye)。尝试将这些输入到浏览器的地址字段中,再次确保使用相应的端口号,如果不是 3000:

  1. http://localhost:3000/say_hello/index
  2. http://localhost:3000/say_hello/bye

你的浏览器应分别为每个地址显示 “Hello world” 和 “Bye bye”。如果所有都如期运行,你可以继续阅读“剖析简单 Rails 应用”一节。但是,如果你看到数据库错误,请首先阅读下一节“无法找到数据库?”