[英]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)的更完整說明,請參閱我的深入文章:
要了解Rails,您需要從多個角度來看待它,包括軟件架構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.