【发布时间】:2010-12-28 05:30:16
【问题描述】:
谁能用 Ruby on Rails 用外行的方式向我解释 MVC。我对理解 MVC 中的模型特别感兴趣(无法理解模型)。
【问题讨论】:
标签: ruby-on-rails model-view-controller design-patterns architecture
谁能用 Ruby on Rails 用外行的方式向我解释 MVC。我对理解 MVC 中的模型特别感兴趣(无法理解模型)。
【问题讨论】:
标签: ruby-on-rails model-view-controller design-patterns architecture
我认为了解 MVC 的最佳方式是通过示例。尝试使用 MVC 编写一个简单的 Rails 应用程序。网上有很多教程,比如the blog example at "Getting Started with Rails"。
如果选择通过编写示例来学习,请查看Where can I find clear examples of MVC?的答案
【讨论】:
您的模型是您的程序使用的数据结构。
视图是与屏幕交互的部分或上一层。
Controller 一般处理模型和视图之间的数据
MVC 结构通常是嵌套的,因此“模型”或“视图”可能包含自己的 MVC(想想屏幕上的组件。您可能只是用字符串填充它,但在幕后是组件的代码绘制自己的小视图,拥有自己的小模型(您传入的字符串),并有一个小控制器将数据绘制到视图上。
在 Rails 中,模型、视图和控制器的角色由框架明确定义,任何教程都会在引导您完成创建的文件时指出这三个组件。
在其他系统中,这些部分可能更难识别。此外,MVC 并不是“完美的”,请记住,有有效的替代方案,但它是开始组织的好方法。
【讨论】:
MVC 不仅仅适用于 Ruby on Rails。它实际上是在 Ruby on Rails 出现之前创建的。它主要只是一种组织代码的方式,以便您拥有一些负责模型的代码(数据库表的 Class 版本),一些负责您的视图的代码(视觉上显示给用户的内容)和负责的代码对于您的控制器(将视图与模型联系起来并执行大部分逻辑。
这是非特定于框架的描述。每个使用 MVC 的框架都有不同的实现方式。对于 Ruby on Rails,每个模型都将数据库表表示为一个类,该类可以直接在代码中与其他对象进行通信,而无需编写任何 SQL。所有的 SQL 都在后台处理,你只需要把它想象成一个普通的类(差不多,它还不是无缝的)。视图主要是 HTML,表示将发送到浏览器的内容。控制器只是将模型和视图通信在一起的代码。
总而言之,MVC 不仅仅针对 Ruby on Rails……它只是最流行的。
【讨论】:
一些背景知识,MVC 是一种(复合)设计模式,由 Trygve Reenskaug(Smalltalk)于 1979 年开发。
真正的 MVC 最初计划用于 n 层(非 Web)系统,它将系统拆分为 3 个不同的部分,即模型、视图和控制器
模型
观点
控制器
** 经典 MVC 不适合 Web 应用程序,因为模型无法以观察者的方式将所有更改发送到视图(视图是网页)。上世纪 90 年代,JSP 团队引入了 Model2 来克服不断变化的基础架构。 MVC Web 框架实际上不是 MVC,而是 Model2(Ruby on Rails 也是如此)。
这里是来自大师 Martin Fowler 对包括 MVC 在内的 GUI 模式的描述 GUI Architectures
到目前为止我找到的最好的书是Agile Web Development with Rails。它从假设没有知识开始,并且非常全面。
希望这对您有所帮助!
【讨论】:
@var 总是有效的原因,并且与许多其他框架明显不同,在这些框架中,视图的执行与控制器完全分开。
Ruby on Rails 没有实现 MVC 设计模式。 Ruby on Rails 具有称为控制器、模型和视图的文件夹。视图文件夹包含 HTML 文件。控制器和模型文件夹有 ruby 文件。控制器映射到一个 URL,并且控制器中的一个方法在请求该 URL 时执行,相关的视图(HTML 文件)被加载,并且它的模型(数据结构)用于填充视图。这就是它与 MVC 设计模式的相似程度。人们说它是 MVC 很可惜,因为它引起了一代人对 MVC 设计模式的困惑和误解。
在 Rails 中,模型是一种数据结构。
【讨论】:
MVC 基本上表示模型-视图-控制器。并且 MVC 被 PHP、Perl、Python 等许多语言使用。通常 MVC 是这样工作的:
请求首先到达控制器,控制器找到合适的视图并与模型交互,模型与您的数据库交互并将响应发送给控制器,然后控制器根据响应将输出参数提供给视图。
【讨论】:
以下是关于 MVC 模式如何工作的简要概述:
控制器:
型号:
查看:
需要注意的一点是模型不能直接与视图通信,反之亦然。只有控制器可以与视图和模型通信,因此控制器充当从浏览器上的用户交互中检索到的交互/事件的委托者。
【讨论】:
模型视图控制器原则将应用程序的工作划分为 3 个独立但密切合作的子系统。
模型(ActiveRecord):
它维护对象和数据库之间的关系,并处理验证、关联、事务等。
该子系统在 ActiveRecord 库中实现,该库在关系数据库中的表和操作数据库记录的 Ruby 程序代码之间提供接口和绑定。 Ruby 方法名由数据库表的字段名自动生成。
视图(ActionView):
它是以特定格式呈现数据,由控制器决定呈现数据触发。它们是基于脚本的模板系统,如 JSP、ASP、PHP,并且很容易与 AJAX 技术集成。
此子系统在 ActionView 库中实现,该库是一个基于嵌入式 Ruby (ERb) 的系统,用于定义数据表示的表示模板。每个到 Rails 应用程序的 Web 连接都会显示一个视图。
控制器(ActionController):
应用程序中用于引导流量的工具,一方面,查询模型以获取特定数据,另一方面,将数据组织(搜索、排序、消息传递)成适合用户需求的形式给定的观点。
该子系统在 ActionController 中实现,它是位于 ActiveRecord(数据库接口)和 ActionView(表示引擎)之间的数据代理。
查看以下链接以清楚地了解 Rails 中的 mvc:
http://www.bogotobogo.com/RubyOnRails/RubyOnRails_Model_View_Controller_MVC.php
https://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/
【讨论】: