深入探索

MVC

如前所述,Rails 采用模型(Model),视图(View)和控制器(Controller)(或 MVC)模式。虽然这三个组成部分在理论上是分开的实体,但实际上不可避免地存在一定程度的重叠。例如,一些计算可以在模型中完成,其它计算在控制器中完成;影响数据格式化的操作可能发生在控制器或视图中。没有硬性和绝对的规则 - 只是一个一般原则,即尽可能地在模型中发生“接近数据”的操作,“接近显示”的操作应该在视图中发生,其它一切应该进入控制器。

那是理论上的 MVC。现在让我们看看 Rails 如何实现它…

Model

Ruby On Rails 中的模型(Model)是数据库中表的组合 - 由 MySQL 等数据库服务器处理 - 以及一组匹配的 Ruby 类来处理这些表。例如,在 Blog 中,你可能拥有一个包含名为 Posts 的表的数据库。在这种情况下,Rails 模型还将包含一个名为 Post 的 Ruby 类(注意 Rails 与复数一起使用 - Posts 表可以包含许多 Post 对象!)。Ruby Post 类通常包含从 Posts 数据库中查找,保存或加载单个 Post 记录的方法。数据库表和相应的 Ruby 类的这种组合构成了 Rails 模型(Model)。

View

视图(View)几乎就是它的样子 - Ruby On Rails 应用程序的可视化表示。它(通常不一定)以 HTML 模板的形式创建,其中混合了一些 Ruby 代码。事实上,其它视图类型(例如,使用 Adobe 的 Flex 或 Microsoft 的 Silverlight 制作的图形视图)是可能的,但 Rails 默认为 HTML。这些模板,通常具有扩展名 .html.erb(但也可能使用扩展名 .rhtml,这是 Rails 1 默认的),不会直接加载到 Web 浏览器中 - 毕竟,Web 浏览器没有任何运行 Ruby 代码的方法。相反,它们由一个单独的工具预处理,该工具执行 Ruby 代码以便与模型交互(根据需要查找或编辑数据),然后,作为最终结果,它创建一个新的 HTML 页面,其基本布局由一个 ERb 模板定义,但其实际数据(即博客文章,购物车项目或其它内容)由模型提供。

Controller

控制器(Controller)采用 Ruby 代码文件的形式,作为链接模型和视图的中间件。例如,在网页(视图)中,用户可以单击按钮将新帖子添加到博客;使用普通的 HTML,这个按钮提交一个名为 ‘Create’ 的值。这导致一个名为 create 的方法,在一个帖子’控制器’(一个 Ruby 代码文件)中将已经输入网页(视图)的新博客条目(一些文本)保存到数据库中(该模型的数据存储库)。

Rails 文件夹

这是 Rails 生成的顶级文件夹的简化指南,简要描述了它们包含的文件和文件夹:

  • app

    它包含特定于此应用程序的代码。子子文件夹是:app\controllers, app\models, app\viewsapp\helpers

  • config

    Rails 环境的配置文件,路由映射,数据库和其它依赖项;一旦我定义了数据库,会包含配置文件 database.yml

  • db

    包含 schema.rb 中的数据库概要信息,并且可能包含作用于数据库中数据的代码。

  • doc

    可能包含 RDOC 文档(有关 RDOC 的更多信息,请参阅附录)。

  • lib

    可能包含应用程序的代码库(即,逻辑上不属于 \controllers\models\helpers 的代码)。

  • log

    可能包含错误日志。

  • public

    该目录包含可由 Web 服务器使用的“静态”文件。它有图片,样式表和 javascripts 的子目录。

  • script

    包含 Rails 用于执行各种任务的脚本,例如生成某些文件类型和运行 Web 服务器。

  • test

    这可能包含由 Rails 生成或由用户指定的测试文件。

  • tmp

    Rails 使用的临时文件。

  • vendor

    可能包含第三方库,这些库不构成 Rails 默认安装的一部分。

其它 Ruby 框架

Rails 可能是最著名的 Ruby 框架,但它肯定不是唯一的。其它如 Ramaze,Waves 和 Sinatra 也有专门的追随者。一个名为 Merb 的框架曾被视为最接近 Rails 的竞争对手。然而,在 2008 年 12 月,Rails 和 Merb 团队宣布他们将合作进行 Rails 的下一次迭代 - “Rails 3”。

如果你有兴趣探索其它 Ruby 框架,请点击以下链接:

Merb: http://merbivore.com/

Ramaze: http://ramaze.net/

Sinatra: http://sinatra.rubyforge.org/

Waves: http://rubywaves.com/

Ramaze 开发人员维护了一个更全面的 Ruby 框架列表,你可以在他们的主页上找到它们。