图解 Ruby on Rails(二)
写代码
我们将创建一个合作的菜谱来持有和共享每个人喜欢的食物。我们想我们菜谱应该:
1、显示所有食物的列表。
2、创建新食物并可编辑现有食物。
3、为一个食物指派一个分类(如:甜点类或汤类等等)。
你可以在你喜欢的任何目录内创建你的菜谱应用程序,但我使用c:railscookbook目录。本文假设的所有的部分都是以这个路径为基本目录路径。如果你选择了不同的位置,要确保必须的调整,以便你的应用程序能看到这个路径。
如果你愿意,你可下载完整的Rails菜谱例子。如果这样做了,看看cookbook/目录,为它重建个数据库。
创建个空的Rails Web 应用程序
Rails即是个运行时Web应用程序框架,也是一组帮助脚本,用于自动化在开发一个Web应用程序时你需要做的一些事情。在这一步,我们将使用一个帮助脚本来创建完整的目录结构并初始化启动我们菜谱应用程序的文件。
1、打开命令行窗口,并进入你想创建这个菜谱Web应用程序的目录。我使用c:rails。
2、运行下面命令:
rails cookbook
这将创建一个cookbook子目录,它包含一个完整的目录树,有这个空Rails应用程序使用的文件夹和文件。

图 6. 新创建的Rails应用程序目录。
测试这个空的Web应用程序
一个Rails Web应用程序可以运行在任何虚拟的Web服务器上,但配置一个Rails Web应用程序的最方便的途径是使用内建的WEBrick Web服务器。让我们启动这个Web服务,然后浏览我们的菜谱应用程序。
1、在命令窗口中,移动到cookbook目录。
2、运行这个命令:
ruby scriptserver
来启动服务器(图7)。
3、现在打开你的浏览器,并浏览http://127.0.0.1:3000/。你应该看到像图8样的一些东西。[如果不行的话,就应该输入本地机器保留的特定地址。]

图 7. 启动WEBrick 服务
离开命令窗口并让Web服务正常运行,因为我们的过程要使用它。

图 8. Rails 缺省页
Rails 应用程序目录结构
Rails试图将你必须做的工作难度减到最小,并排除不必要的工作。当你用Rails帮助脚本来创建你的空的应用程序时,它为这个应用程序创建完整的目录结构(图9)。Rails知道在哪儿能找到它需要的这个结构,所以你不必告诉它。记住,没有配置文件!

图 9. 一个Rails 应用程序目录结构
我们大多数开发工作是创建和编辑c:railscookbookapp子目录内的文件。下面是如何使用它们的快速指南。
1、controllers子目录存放Rails要查找控制类。控制器处理来自用户的一个Web请求。
2、views子目录存有用我们的应用程序的数据库填充有数据的显示模板。
3、models子目录存有模板和包装我们在应用程序数据库内存储的数据的类。在大多数框架中,应用程序的这一部分可会增长得非常杂乱,冗长,并更倾向于错误。Rails将它变得非常简单。
4、helpers子目录持有所有用于支持模型,观察器,和控制器类的帮助类。帮助类可使模型,观察器,和控制器的代码小,专注,和整洁。
控制器和URLs
马上,我们就创建菜谱数据库并开始开发我们的应用程序。首先,最重要的是理解Rails内的控制器是如何工作的,以及URLs是如何映射到(并运行)控制器方法的。
控制器类处理来自用户的请求。请求的URL映射到一个控制器类内的一个方法。这个工作是如何完成呢?
离开你正在运行Web服务的命令行窗口,打开第二个命令行窗口,定位到应用程序的基本目录,c:railscookbook。它看起来应该与图10一样。

图 10. cookbook 的controller 目录
我们将使用另一个Rails帮助脚本来为我们创建一个新的控制器类。在命令行窗口,运行这个命令:
ruby scriptgenerate controller MyTest
这个命令会创建一个名为my_test_controller.rb的文件,它包含一个定义类MyTestController的外架。
在c:railscookbookcontrollers目录内,右击这个文件并选择编辑它。这个文件的显示应类似于图11。

图 11. 编辑MyTestController
看看会发生什么事?在浏览器中输入http://127.0.0.1:3000/garbage/。结果应与图12一样。

图 12. 浏览器对未知控制器的反应
这不会让人很惊讶。现在试着输入http://127.0.0.1:3000/My_Test/, 显示如图13。.

图 13. 使用新控制器的浏览器
啊…现在看出差别了。URL的MyTest映射到新创建的控制器。现在好像是Rails在这个控制器内试着找一个名为index的动作,但可惜的是没有找到。
让我们现在修改一下。添加一个index方法到你的controller类中,像图14一样。

图 14. MyTestController的index方法。

浙公网安备 33010602011771号