Ruby 和 Rails 入门
贡献者:Chris Kutler
2007 年 12 月 [修订号:V6.0-2]
翻译:Dave(NetBeans 中文社区成员)
本教程将带给您一段有关 NetBeans IDE 中 Ruby 和 Ruby on Rails 应用程序开发的旋风之旅。本教程将通过完成应用程序开发中的几个典型阶段来向您展示如何使用 IDE 的 Ruby 支持来进行应用程序开发。
由于本教程的设计使然,您不必按任何特定的顺序进行学习。您可以快速地浏览本教程,然后在时间允许的情况下回顾各个部分。如果您喜欢按部就班的教程,您可以先尝试一下 10 分钟创建 Ruby Weblog。
目录
|
|
 |
教程需求
学习本教程需要以下技术和资源:
参见安装和配置 Ruby 支持一文以获取有关安装和配置 NetBeans Ruby 支持以及从 NetBeans Ruby on Rails 项目中使用数据库服务器工作的信息。
所谓项目,它相当于一个应用程序的工作环境。当您创建一个新的 Ruby 项目时,您可以选择使用已有文件创建项目,或者为您的 Ruby 项目使用模板创建一组新文件夹。
注意:当您打开一个在 IDE 之外构建的已有 Ruby 或 JRuby 项目时,IDE 对该项目所做的与 NetBeans 软件相关的唯一改动,仅仅是创建一个名为 nbproject 的文件夹,用以存储 NetBeans 元数据。
您可以在 IDE 中同时打开多个项目。当您打开超过一个项目时,您必须指定 其中一个为主项目。主项目是当您点击“运行主项目”按钮时 IDE 所运行的那个。要切换主项目,在“项目”窗口中右键点击一个项目,然后选择“设置为主项目”。
当您创建一个新的 Ruby 项目时,IDE 会默认创建一个名为 main.rb 的文件,并将该文件设置为主脚本。当您点击“运行主项目”按钮(
)时,IDE 会保存所有文件改动并运行主脚本。要切换至一个不同的启动脚本,在“项目”窗口中右键点击项目节点,然后在弹出菜单中选择“属性”。选择“运行”栏目,然后在“主脚本”文本框中键入文件名。
注意:main.rb 文件是为 Ruby 项目创建。当您创建一个 Ruby on Rails 项目时,如在创建 Ruby on Rails 项目一节所示,IDE 不会创建 main.rb 文件。
试试看
下面即为创建 Ruby 项目的步骤。
-
如果您尚未开始,那么首先使用下面所列的适当步骤启动 IDE:
- Windows、Solaris 和 Linux 双击 NetBeans 桌面图标。
- Mac 双击安装文件夹中的 NetBeans 图标。
- 右键单击“项目”窗口中的空白处,然后在弹出菜单中选择“新建项目”。
- 在“新建项目”向导中,选中“类别”面板中的 Ruby,选中“项目”面板中的“Ruby 应用程序”,然后点击下一步。如果此项目是您打开或创建的第一个 Ruby 项目,则可能会出现一个对话框,要求您选择一个 Ruby 解释器。在解释器选项中选中一个,然后点击“确定”。
-
给项目命名,例如 simple_ruby_application,然后点击“完成”。
IDE 会在编辑器中显示 main.rb 文件。留意代码是如何调用 puts 来显示字符串“Hello World”的。
- “项目”窗口展示了项目文件的逻辑视图。点击“文件”选项卡查看物理布局,然后切换回, 开关“项目”窗口。对于 Ruby 项目,这两个视图是很相似的。
-
点击“运行主项目”按钮(
)运行应用程序。
IDE 会在其底部的窗口中显示输出,如下图所示。
图 1:“输出”窗口

操作 Ruby 项目文件与使用文本编辑器处理它们比较类似。您可以通过双击“项目”窗口或者“文件”窗口中的文件节点打开文件。您也可以按下“Alt-Shift-O”组合键(在 Mac 中请使用“Ctrl-Shift-O”组合键)来通过文件名访问文件。
IDE 的编辑器提供了很多特性来帮您完成程序设计的任务。您将在本节学习一些基本的编辑特性。完整的编辑特性列表可以参考 NetBeans Ruby Editing Wiki 页面。
试试看
下面的步骤将创建一个用以显示产品列表的简单的 Ruby 项目。首先,为一个单独的产品条目创建一个类。然后,为条目列表创建一个类,以及一个数据文件来提供产品数据。最后,编缉 main.rb 文件显示列表。在开发代码的同时,这些步骤也会介绍编辑特性。
创建 Item 类
- 创建一个 Ruby 项目,或者使用您在前一节中所创建的那个。
-
在“项目”窗口中,右键点击“源文件”节点,在弹出菜单中选择“新建”->“Ruby 类”,创建一个类文件。在“类”文本框中键入 Item,然后点击“完成”。
IDE 会创建一个名为 item.rb 的文件,并在编辑器中将其打开。
-
将 item.rb 文件中的内容替换成下面不正确的代码。您将在余下的步骤中修正这些代码。
| 代码示例 1:Item 类 |
class Item def initialize(id, type, price) end def simple_method(id, type, price) @id = id @type = type @price = price.to_f end def to_s "Item #{@id} is a #{@type}: Price $#{@price}" end end
|
- 在源文件中点击右键,然后在弹出菜单中选择“格式化代码”,格式化代码。
- 留意 initialize 方法的参数下面的灰色波浪线,如下图所示。这些线标示出了未使用的变量。您将在后面两个步骤中修正该错误。
图 2:未使用的变量

- 将光标置于 @type(位于 simple_method 中),然后按下“Alt-Shift-Period”组合键(Period 是句点号,在 Mac 中请使用“Ctrl-Shift-Period”组合键)来选中该行。再一次按下按键组合来选中块,如下图所示。
图 3:多行选择

- 在源文件中点击右键,然后在弹出菜单中选择“剪切”。
- 将光标置于构造函数头部(initialize 方法),然后按下“Shift-Enter”组合键,在当前行下添加一个新行。在新行处点击右键,然后从弹出式菜单中选择“粘贴”。
-
simple_method 方法的目的原是来保存之前步骤中所需的代码。现在,您可以将此方法删除掉。首先,将光标置于 simple_method 方法的 end 语句处。
留意 IDE 会高亮显示其对应的 def 语句。
- 按下“Alt-Shift-Period”组合键(Period 是句点号,在 Mac 中请使用“Ctrl-Shift-Period”组合键)来选中该方法,然后按下“BackSpace”键将其删除。
- 将光标置于空行处,按下“Ctrl-E”组合键(在 Mac 中请使用“Cmd-E”组合键)将其删除。
-
接下来的几步将展示如何使用代码补全功能。在类块顶部打开一个空行,将光标置于该行处,键入 attr_a,然后按下“Ctrl-Space”组合键(若“Ctrl-Space”组合键在您的系统中无效,请使用“Ctrl-\”组合键)。
IDE 会显示一个列表,列出可能的代码补全,如下图所示。
图 4:attr_a 的代码补全列表

-
选择 attr_accessor :attr_names rw,然后按下“Enter”键。
IDE 将补全代码,并选择 attr_names 用于编辑,如下图所示。
图 5:补全的代码

-
键入 id, :type, :price 来完成语句,然后按下“Enter”键。
语句应如以下代码所示。
attr_accessor :id, :type, :price
-
选择 attr_accessor 方法的每一个参数,留意 IDE 会高亮显示每个属性的使用。
完成后的脚本应如以下代码示例所示。
| 代码示例 2:格式化后的 Item 类 |
class Item attr_accessor :id, :type, :price def initialize(id, type, price) @id = id @type = type @price = price.to_f end def to_s "Item #{@id} is a #{@type}: Price $#{@price}" end end
|
创建 ItemsList 类
- 在“项目”窗口中,右键点击“源文件”节点,在弹出菜单中选择“新建”->“Ruby 类”,创建另一个类文件。在“类”文本框中键入 ItemsList,然后点击“完成”。注意,IDE 会将文件命名为 items_list.rb。
-
用下列语句替换 items_list.rb 文件的内容。
| 代码示例 3:ItemsList 类 |
class ItemsList
DATA_FILE="data.txt" attr_accessor :items
def initialize @items = ItemsList.load_item_data end
private
def self.load_item_data items = [] File.open(DATA_FILE) do |data_file| data_file.readlines.each do |line| items << Item.new(*line.split("\s")) end end items end end
|
-
在类定义前面打开一个空行,并键入 require'(单引号)。
留意 IDE 会提供结尾处的单引号,并将光标置于两个引号内部,如下图所示。 IDE 能自动插入或者删除匹配的分隔符,如引号、花括号、小括号,以及代码块的 end 语句等等。
图 6:分隔符对匹配

- 光标位于引号内部,键入 it,然后按下“Ctrl-Space”组合键。仅有一项可用的 import 是以“it”开头的,如下图所示。按下“Tab”键接受该选项。
图 7:require 语句的代码补全

创建数据文件
- 在“项目”窗口中,右键点击“源文件”节点,然后在弹出菜单中选择“新建”>“其他”。在“类别”面板中选择“其他”,在“文件类型”面板中选择“空文件”,然后点击“下一步”。
- 在“文件名”文本框中键入 data.txt。
-
确保“文件夹”被设置为 lib,点击“完成”。
注意:您正将该文本文件放置在 lib 文件夹中,因为,在默认情况下,当您从 IDE 中运行项目时,默认的工作目录即为 lib 文件夹。
-
将下列文本粘贴至 data.txt 文件中。
| 代码示例 4:产生数据 |
BF15678 book 25.32 C29589 cd 18.95 F89028 beverage 2.00 BN98232 book 45.33 BF15890 book 15.98
|
创建主脚本并运行应用程序
-
在“项目”窗口中,双击 main.rb,将其显示在编辑器窗口中。使用下列语句替换其内容,这些语句将显示条目列表:
| 代码示例 5:用于 main.rb 的内容 |
require 'items_list'
items_list = ItemsList.new items_list.items.each do |item| line_item = item.to_s line_item.gsub!(/book/, 'fiction \0') if item.id =~ /\AB[FN]/ line_item.gsub!(/fiction/, 'non-\0') if item.id =~ /\ABN/ puts line_item end puts "\n"
|
- 刚刚复制的代码中包含两个正则表达式对象:/\AB[FN]/ 和 /\ABN/。将光标置于其中一个正则表达式对象内部,如下所示,并按下“Ctrl-Space”组合键。 IDE 会显示一个列有正则表达式字符及字符组合的列表。看一下代码示例 5 中的数据,并猜测一下哪个条目会被这两个正则表达式分别匹配。
图 8:正则表达式的代码补全

-
点击主工具栏中的“运行主项目”按钮来运行项目。
IDE 会保存所有改动,并运行 main.rb 脚本。应用程序的输出将会出现在“输出”窗口中,如下图所示。
图 9:simple_ruby_application 的输出

- 为了练习一下目前所学到的内容,创建 另一个 Ruby 项目。阅读项目,并在任务列表中显示条目。
更多信息
在 IDE 中创建 Ruby on Rails 项目与在终端窗口中使用 rails 命令十分类似。实际上,当您创建项目时,IDE 会创建与 rails 所创建的相同的文件夹和文件。
创建一个项目,可以通过在“项目”窗口中右键点击,然后在弹出菜单中选择“新建项目”来实现。在“类别”面板中选择“Ruby”,在“项目”面板中选择“Ruby on Rails 应用程序”或者“包含已有代码的 Ruby on Rails应用程序”。
您可以在 IDE 中同时打开多个项目。主项目(NetBeans 动作实际操作的项目)节点会以粗体显示。要切换主项目,在“项目”窗口中右键点击一个项目,然后选择“设置为主项目”。
如下图所示,“新建项目”向导的第二个页面让您对项目进行命名,并指定其位置。在下拉列表中提供了一些支持的数据库服务器名称。IDE 使用选定的数据库服务器以及“使用 JDBC 访问数据库”选项来决定如何对 database.yml 文件写入内容。
图 10:“新建 Ruby on Rails 项目”向导的第二页

试试看
按如下步骤来创建一个 Ruby on Rails 项目。
- 右键点击“项目”窗口中的空白处,然后在弹出菜单中选择“新建项目”。
- 在“新建项目”向导中,选中“类别”窗格中的 Ruby,选中“项目”窗格中的“Ruby on Rails应用程序”,然后点击“下一步”。如果此项目是您打开或创建的第一个 Ruby 项目,则可能会出现一个对话框,要求您选择一个 Ruby 解释器。在解释器选项中选中一个,然后点击“确定”。
- 命名该项目,如 simple_rails_application。
-
接下来,选择应用程序要使用的数据库服务器。若正在使用 JRuby,则必须选择 MySQL、PostgresSQL、Oracle、HSQLDB 或者 Java DB(也称为 Derby)。
IDE 使用这些信息来初始化 database.yml 文件。
注意:若仅在本教程中使用此项目,则无需访问任何数据库,故可以接受默认的数据库设置。
-
若正在使用 JRuby,且访问 MySQL 之外的数据库服务器,则必须选中“使用 JDBC 访问数据库”复选框。若数据库服务器是 MySQL,则是否使用 JDBC 是可选的。
当选中该复选框时,IDE会向 environment.rb 文件中添加语句,使用 ActiveRecord-JDBC gem。
注意:要使用 JDBC 连接,必须获取所用数据库服务器的 JDBC 3.0 客户端驱动程序,并将该 JDBC 驱动程序的一份拷贝放置在 JRuby/lib 文件夹中。
- 点击“完成”。
- 在“项目”窗口中检查文件结构的逻辑视图。
- 右键点击项目节点(项目的根节点),留意菜单选项。
-
点击“文件”选项卡,比较一下此物理文件结构和“项目”窗口中显示的逻辑视图。
下图将窗口分列出来,便于两个视图的对比。
图 11:“项目”窗口与“文件”窗口的比较

- 在“文件”窗口中右键点击项目节点,与“项目”窗口中的弹出菜单相比较,留意菜单选项的不同。 例如,“项目”窗口中项目节点的弹出菜单提供了“生成”动作、“运行 Rake 任务”动作、“Rails 控制台”动作,以及许多其他 Rails 相关的动作。
除了 Ruby 项目,NetBeans Ruby 支持也能操作 Ruby on Rails 项目。Rails 是一种允许快速创建以数据库为后端、基于模型-视图-控制器(MVC)结构的 Web 应用程序的框架。
和 Ruby 项目一样,在编辑器中打开文件可以通过在“项目”窗口或者“文件”窗口中双击文件节点,或者通过按下“Alt-Shift-O”组合键(在 Mac 中请使用“Ctrl-Shift-O”组合键)使用文件名访问文件。
“项目”窗口中节点的弹出菜单提供了 Rails 脚本和 Rake 任务的便利访问,如用于生成代码的 generate 脚本、用于将数据库表迁移至特定版本的 db:migrate 任务。
IDE 能够理解文件类型之间的关系,而且能方便的导航至相关文件。例如,如果您正在编辑一个视图文件,您可以使用弹出菜单导航至其相关的动作文件或者测试。
与所有 NetBeans 项目一样,可以通过点击“运行主项目”按钮来运行应用程序。IDE 会保存所有文件改动,如必要的话启动 web 服务器,然后在浏览器中显示欢迎页面。您也可以使用编辑器中的“运行文件”菜单动作以相关的 URL 在浏览器中打开您正在编辑的无论控制器、动作、视图或是帮助文件。
试试看
完成下列步骤来创建在使用 Ruby 文件一节中所展示的样例项目的 Rails 版本。在此变体中,构造函数将使用散列而不是位置参数,获取数据是从 YAML 文件中,而且 Item 类中 ItemsList 功能被删除掉了。
注意:典型的,在 Rails 项目中,模型类是基于数据库表的。然而,为了让此样例快速且简单,应用程序将从一个 YAML 文件中获取数据。
创建模型类
- 创建一个 Ruby on Rails 项目,或者使用您在前一节中所创建的那个。
-
在“项目”窗口中,右键点击“模型”节点,然后在弹出菜单中选择“生成”。
“Rails 生成器”对话框将被打开,在“生成”下拉列表中选择“模型”,如下图所示。
图 12:从“模型”节点调用的“Rails 生成器”

-
在“参数”文本框中键入 Item,然后点击“完成”。
IDE 会创建一个名为 item.rb 的文件,并在编辑器中将其打开。 表示改文件的节点会出现在“项目”窗口中的“模型”节点下。IDE 会同时在“单元测试”下创建一个测试套件、在“测试套件(Fixture)”下创建一个测试套件、以及在“数据库迁移”->“迁移”下创建一个迁移。
-
用下列代码替换 item.rb 文件的内容。
| 代码示例 6:Item 类 |
# Takes: # :id => unique item id # :type => type of item # :price => price of the item
class Item DATA_FILE="data.yml" attr_accessor :id, :type, :price
def initialize(attributes) @id = attributes['id'] @type = attributes['type'] @price = attributes['price'].to_f end
def to_s "Item #{@id} is a #{@type}: Price $#{@price}" end def self.load_item_data YAML.load_file(DATA_FILE).collect do |item_hash| Item.new(item_hash) end end end
|
创建数据文件
- Item 类要求 data.yml 文件作为其数据。要创建该文件,在“项目”窗口中,右键点击项目节点,在弹出菜单中选择“新建”->“其他”。
- 在“新建文件”对话框中,在“类别”面板中选中“Ruby”,在“文件类型”面板中选中“YAML 文件”,点击“下一步”。
-
在“文件名”文本框中键入 data,点击“完成”。
IDE 将在项目的根文件夹下创建一个名为 data.yml 的文件,并在编辑器中将其打开。由于该文件位于根文件夹下,故无法在“项目”窗口的逻辑视图中看到它。不过,它还是会出现在“文件”窗口中。
-
用下列文本替换 data.yml 文件的内容。
| 代码示例 7:data.yml |
- id: BF15678 type: book price: 25.32 - id: C29589 type: cd price: 18.95 - id: F89028 type: beverage price: 2.00 - id: BN98232 type: book price: 45.33 - id: BF15890 type: book price: 15.98
|
创建控制器和视图
-
模型已经准备好了。现在来添加控制器和视图。在“项目”窗口中,右键点击“控制器”节点,然后在弹出菜单中选择“生成”。
“Rails 生成器”对话框将被打开,在“生成”下拉列表中选择“控制器”,如下图所示。
图 13:从“控制器”节点调用的“Rails 生成器”

-
在“名称”文本框中键入 Item,在“视图”文本框中键入 index,点击“确定”。
IDE 将创建ItemController 类,并在“视图”->“item”下创建 index.rhtml 视图。此外,IDE 还会创建“功能测试”->“item_controller_test_rb”和“帮助”->“item_helper.rb”。
-
用下列代码替换 item_controller.rb 文件的内容。
| 代码示例 8:ItemController 类 |
class ItemController < ApplicationController def index @items = Item.load_item_data end end
|
控制器在调用 index 视图前所调用的 index 动作,使用条目列表来填充 @items 全局数组。
- 要快速访问 index.rhtml 文件,在 index 定义中右键点击,在弹出菜单中选择“导航”->“转至 Rails 动作”或“转至 Rails 视图”,如下图所示。
图 14:导航至视图

-
使用如下标记替换 index.rhtml 文件的内容。
| 代码示例 9:index.rhtml |
<h1>List of Items</h1>
<table border="1"> <tr><th>Id</th><th>Type</th><th>Price</th></tr>
<% for item in @items %> <tr> <td><%= item.id %> </td> <td><%= item.type %></td>
<td class="align-right"><%= '%.02f' % item.price %></td> </tr> <% end %> </table>
|
嵌在 HTML 中 Ruby 代码会遍历由控制器中的 index 动作所定义的 @items 全局数组。
运行应用程序
-
点击主工具栏中的“全部保存”按钮来保存全部改动。
在文件选项卡头部文件名处的星号(*),表示文件有改动,现在会消失了。
-
在编辑器中单击鼠标右键,然后选择“运行文件”。
IDE 把 item 控制器和 index 动作的 URL 发送至服务器,服务器再将下列页面发送至浏览器。
图 15:浏览器中显示的 index 视图

-
可以试着点击“运行主项目”来运行整个应用程序。
会发现标准的 Ruby on Rails 欢迎页面将被显示出来。这是由于路由器默认显示“Public”->“index.html”文件。后面的步骤将会更改路由选择。
- 在“项目”窗口中扩展“Public”。
- 右键点击“index.html”节点,然后在弹出菜单中选择“删除”。
- 在“项目”窗口中扩展“配置”节点,双击“routes.rb”,将其在编辑器中打开。
- 查找以下注释:
# map.connect '', :controller => "welcome"
使用如下粗体所示的代码替换该注释。
| 代码示例 10:路由选择代码 |
# You can have the root of your site routed by hooking up '' # -- just remember to delete public/index.html. map.connect '', :controller => "item"
|
- 为了确保路由选择的改动能被服务器所采用,点击 IDE 右下角的服务器停止按钮,如下图所示。
图 16:服务器停止按钮

- 点击“运行主项目”以在浏览器中启动应用程序。
练习所学知识
- 现在试着从头开始构建一个项目。创建一个 Ruby on Rails 项目能在任务列表中显示条目。
-
可以参考与 JRuby 一起使用数据库和 10 分钟创建 Ruby Weblog。
若使用数据库表代替文件,那怎样来构建任务列表应用程序呢?
更多信息
- 参见 NetBeans Ruby 文档索引,获取视频演示和教程。
- Ruby on Rails web 站点包含丰富的视频、展示、教程、及示例内容。
- 可以使用“插件”工具下载和安装 Ruby Depot 样例应用程序(可能您所使用的 IDE 版本已经将其安装了)。插件安装后,在“项目”窗口中单击鼠标右键,在弹出菜单中选择“新建项目”。扩展“类别”面板中“样例”节点,选中“Ruby”。选择“Depot”,并点击“下一步”。点击“完成”,并遵照浏览器中所显示的自述文件(README)中给出的指导说明。
正如您所猜测的 JRuby Interactive Ruby(IRB)控制台是一个能让您交互输入 Ruby 语句的模块,与使用 Ruby IRB 所做的一样。此外,JRuby Interactive Ruby(IRB)控制台还提供了与 Java 平台应用程序之间的互操作性。
可在主菜单中选择“窗口”->“其他”->“Ruby Shell (IRB)”来打开控制台。控制台会在 IDE 的下部出现,如下图所示。
图 17:JRuby IRB 控制台

IRB 控制台是从 NetBeans 安装文件夹下启动的。要切换至另一个文件夹,键入如下命令,将 your-path 替换成指向包含 Ruby 文件的文件夹的路径。
=> Dir.chdir("your-path")
关闭“控制台”窗口不会停止 IRB 会话。当您重新打开该窗口,命令历史记录会依然显示。 要停止会话,在控制台中键入 quit 或者 exit。
试试看
- 在主菜单中,选择“窗口”->“其他”->“Ruby Shell (IRB)”来打开 IRB 控制台。
- 键入一些 Ruby 常量来熟悉一下环境,例如 PLATFORM、VERSION、ENV_JAVA、ENV。键入 Object::contants 来查看所有顶级常量。
-
使用 IRB 试用 Ruby 语句例如,键入下列语句,看一下 Ruby 会有什么样的输出:
>> String.ancestors
>> "fig mango orange melon grapes".split(pattern="\s")
>> "users@ruby.netbeans.org" =~ /\A[\w\._%-]+@[\w\.-]+\.[a-zA-Z]{2,4}\z/
试着想想其他您可能想要试验的 Ruby 语句,比如查看抛出异常的类型。
- 体验一下代码补全弹出菜单的特性。键入最初几个字符,然后按下“Tab”键,可以看到一个建议列表,如下图所示。您可以继续输入,以缩短该列表。 选择所需选项,按下“Enter”键。
图 18:代码补全弹出菜单

- 按几下“向上箭头”滚动命令历史记录,然后按“向下箭头”向下滚动。按下“Enter”键,重新执行一条命令。
更多信息
>> 更多 Ruby 文档