深入探索
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\views 和 app\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 框架列表,你可以在他们的主页上找到它们。