【问题标题】:How are Model, View and Controller connected?模型、视图和控制器是如何连接的?
【发布时间】:2013-08-28 10:20:18
【问题描述】:

我了解模型、视图和控制器在应用程序中所扮演的不同角色,但它们是如何相互链接的,例如,一个简单的比较是,当链接 JavaScript 文件和 HTML 文件时,需要一个带有 'src 的标签'参考。

自从学习 Rails 以来,我被告知它们是链接的,但不是如何链接的。

模型、视图和控制器实际上是如何链接的,为什么 MVC 尤其是 Rails 不需要“src”或类似的东西?

【问题讨论】:

  • Rails 甚至不是 MVC。这是 PAC。

标签: ruby-on-rails model-view-controller


【解决方案1】:

基本上都是通过路由控制器和动作链接起来的。

路由文件(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 操作

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>

因为您有一个路由,所以您可以使用路由名称作为链接和按钮的路径,以将数据从浏览器发布回服务器,整个过程从头开始。

这并不是对这一切如何结合在一起的严格描述,但它应该足够接近让您了解这一切是如何发生的

【讨论】:

    【解决方案2】:

    模型-视图-控制器是一种组织 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 的所有其他内容)的更完整说明,请参阅我的深入文章:

    What is Ruby on Rails?

    要了解 Rails,您需要从多个角度来看待它,包括软件架构。

    【讨论】:

    • 这并不能真正解释How are the Model, View and Controller actually linked
    • 模型、视图和控制器实际上是如何链接的?轨道魔法。 :-)
    猜你喜欢
    • 2012-04-11
    • 2014-01-18
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多