簡體   English   中英

模型,視圖和控制器是如何連接的?

[英]How are Model, View and Controller connected?

我理解模型,視圖和控制器在應用程序中扮演的不同角色,但它們是如何相互鏈接的,例如,簡單的比較是在將JavaScript文件與HTML文件鏈接時,需要使用'src'引用標記。

自從學習Rails以來,我被告知他們是聯系在一起的,但不是如何。

模型,視圖和控制器是如何實際鏈接的,為什么MVC特別是Rails不需要'src'或類似的東西?

基本上它都是通過路由控制器和動作鏈接的。

routes文件(your_app_root / config中的routes.rb文件)有效攔截傳入的url並將該url映射到控制器/操作(實際上這是由Nginx等Web服務器完成的,然后通過類似的方式將請求傳遞到rails應用程序獨角獸,但完全是另一個問題)。

因此,對於標准HTML網站設置,您可能有一個名為home的文件夾,在該文件夾中可能有一個index.html

因此,當您導航到some_url / home / index時,您將獲得在瀏覽器中呈現的index.html文件的內容。

在RoR中,您需要一個定義集合的get請求的路由(傳遞多個或沒有參數)

它可能看起來像這樣

YourApp::Application.routes.draw do
  get 'home', to: 'home#index', as: :home
  # etc...

如果您導航到some_url / home,該路由會將您的瀏覽器連接到家庭控制器上的索引操作

家庭控制器中的索引操作可以是空操作

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中間件的深入技術介紹,您可以閱讀RailsGuide:Rails on Rack ,其中描述了Action Dispatcher。

Action Dispatcher執行集成模型,控制器和視圖對象的工作。 當您遵循根據MVC設計模式組織代碼的Rails慣例時,Rails會為您“完成”鏈接代碼的所有工作。 你永遠不會真正看到將MVC片段“鏈接”在一起的代碼。

有關MVC(以及其他所有Rails)的更完整說明,請參閱我的深入文章:

什么是Ruby on Rails?

要了解Rails,您需要從多個角度來看待它,包括軟件架構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM