我理解模型,视图和控制器在应用程序中扮演的不同角色,但它们如何相互链接,例如,简单的比较是将JavaScript文件与HTML文件链接时,需要使用'src标记'参考。
自从学习Rails以来,我被告知他们是联系在一起的,但不是如何。
模型,视图和控制器是如何实际链接的,为什么MVC特别是Rails不需要'src'或类似的东西?
答案 0 :(得分:8)
基本上它都是通过路径控制器和动作链接的。
routes文件(your_app_root / config中的routes.rb文件)有效拦截传入的url并将该url映射到控制器/操作(实际上由Nginx等Web服务器完成,然后将请求传递给rails app通过像Unicorn这样的东西但完全是另一个问题。
因此,对于标准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标签
e.g。
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>
因为您有路线,所以您可以使用路线名称作为链接和按钮的路径,将数据从浏览器发布回服务器,整个过程将重新开始。
这并不是对它们究竟是如何挂在一起的严格描述,而是它足够接近让你知道这一切是如何发生的
答案 1 :(得分:0)
模型 - 视图 - 控制器是一种组织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,您需要从多个角度来看待它,包括软件架构。