我了解模型、视图和控制器在应用程序中扮演的不同角色,但它们是如何相互链接的,例如,一个简单的比较是,在将 JavaScript 文件与 HTML 文件链接时,需要一个带有“src”引用的标签。
自从学习 Rails 以来,我被告知它们是链接的,但不是如何链接的。
模型、视图和控制器实际上是如何链接的,为什么 MVC 尤其是 Rails 不需要“src”或类似的东西?
我了解模型、视图和控制器在应用程序中扮演的不同角色,但它们是如何相互链接的,例如,一个简单的比较是,在将 JavaScript 文件与 HTML 文件链接时,需要一个带有“src”引用的标签。
自从学习 Rails 以来,我被告知它们是链接的,但不是如何链接的。
模型、视图和控制器实际上是如何链接的,为什么 MVC 尤其是 Rails 不需要“src”或类似的东西?
基本上它都是通过路由控制器和动作链接起来的。
路由文件(your_app_root/config 中的 routes.rb 文件)有效地拦截传入的 url 并将该 url 映射到控制器/操作(实际上这是由像 Nginx 这样的 Web 服务器完成的,然后通过类似的东西将请求传递到您的 Rails 应用程序独角兽,但这完全是另一个问题)。
因此,对于标准的 HTML 站点设置,您可能有一个名为 home 的文件夹,在该文件夹中您可能有一个 index.html
因此,当您导航到 some_url/home/index 时,您将获得在浏览器中呈现的 index.html 文件的内容。
在 RoR 中,您需要一个路由来定义一个集合的获取请求(复数或不传入参数)
它可能看起来像这样
YourApp::Application.routes.draw do
get 'home', to: 'home#index', as: :home
# etc...
如果您导航到 some_url/home,该路由会将您的浏览器连接到主控制器上的索引操作
home 控制器中的 index 动作可以只是一个空动作
class HomeController < ApplicationController
def index
end
end
如果你在 app/views/home 文件夹中有一个 index.html.erb,那么你会自动渲染该文件,因为 ActionController 会将你告诉它渲染的任何内容翻译成 HTML、css 和 javascript 或 json 或 XML,如果你是使用资源路由,它接收到的请求是 XML 或 JSON 请求,并将结果数据发送回浏览器
如果您想从数据库中显示一些数据,那么控制器操作有责任获取该数据并将其填充到您的视图可以在 erb 标记中使用的对象(由 @ 符号表示的实例变量)中
例如
class HomeController < ApplicationController
def index
@some_records = SomeModel.all
end
end
然后可以像这样在 index.html.erb 文件中使用它
<ul>
<% @some_records.each do |rec| %>
<li> A record: <%=rec.some_method%> </li>
<% end %>
</ul>
因为您有一个路由,所以您可以使用路由名称作为链接和按钮的路径,以将数据从浏览器发送回服务器,整个过程从头开始。
这并不是对这一切如何结合在一起的严格描述,但它应该足够接近让您了解这一切是如何发生的
模型-视图-控制器是一种组织 Rails 应用程序的软件设计模式。从软件架构师的角度来看,它是一种抽象,只是提供了一种组织代码的方式。您可以在 Rails API 中的类层次结构中看到 MVC 设计模式,特别是 ActionController(控制器)、ActionView(视图)和 ActiveRecord(模型),这些对象可以被子类化以用作 Web 应用程序的组件. 您还可以在 Rails 应用程序的文件结构中看到 MVC 设计模式,您可以在其中找到模型、控制器和视图的文件夹。除非您深入研究 Rails 源代码,否则您不会看到将模型、控制器和视图连接在一起的实际代码。
有关将模型、控制器和视图联系在一起的 Rack 中间件的深入技术介绍,您可以阅读描述 Action Dispatcher的RailsGuide:Rails on Rack 。
Action Dispatcher 负责整合模型、控制器和视图对象。当您遵循根据 MVC 设计模式组织代码的 Rails 约定时,Rails 会为您完成所有“链接”代码的工作。您从未真正看到将 MVC 片段“链接”在一起的代码。
有关 MVC(以及 Rails 的所有其他内容)的更完整解释,请参阅我的深入文章:
要了解 Rails,您需要从多个角度来看待它,包括软件架构。