Rails源码阅读(七)ActionController::Routing::Routes_用户请求在rails中的处理流程(2)
ActionController::Dispatcher把主要工作交给了ActionController::Routing::Routes.call(@env)
ActionController::Routing::Routes的代码:
Routes = RouteSet.new
原来这个常量不是个module,也不是class,是个实例
这样call方法就是RouteSet.new的call方法了
RouteSet的call代码:
def call(env)
request = Request.new(env) #a new一个request真简单!
app = Routing::Routes.recognize(request) #b 识别Controller 下面详细说
app.call(env).to_a #调用call,返回的结果to_a,一定是rack的标准输出了
end
Routing::Routes.recognize(request)做了什么:
def recognize(request)
params = recognize_path(request.path, extract_request_environment(request))
request.path_parameters = params.with_indifferent_access #原来这个东西在这里做的!实际使用发现,一不小心,很难调试的bug就会从这里出来阿!!!
"#{params[:controller].to_s.camelize}Controller".constantize
end
查看返回结果,函数返回了要访问的Controller。
至此,终于接触到达了我们写的代码:XXXController处。
这样app就是某个我们自己写的Controller了,注意这是个类,不是个实例!
从app.call(env).to_a来看,每个Controller都有个call(env)方法,所以应该在父类里。看看继承结构:
XXXController < ApplicationController < ActionController::Base
果然是从super-class来的,否则自己写多麻烦:
ActionController::Base.call方法(注意这里是类方法!):
class << self
def call(env)
# HACK: For global rescue to have access to the original request and response
request = env["action_controller.rescue.request"] ||= Request.new(env)
response = env["action_controller.rescue.response"] ||= Response.new
process(request, response) #这里!
end
# ActionController::Base.process代码:
# Factory for the standard create, process loop where the controller is discarded after processing.
def process(request, response) #:nodoc:
new.process(request, response)
end
end
总结:
#1 RouteSet的call方法,根据访问链接和路由配置,识别出了应该去找哪个XXXController,同时找哪个action也得到了,放入params:
Parameters: {"method"=>:get, "action"=>"follow", "controller"=>"profile"}
#2 执行XXXController.run方法
到这里,执行流程到了:ActionController::Base,即:ActionController::Base.process方法。
====结束====
=== ===
== ==
= =
| |
分享到:
相关推荐
在 Rails 应用中,模型负责数据操作,视图负责展示,控制器则作为两者之间的桥梁,处理用户请求并协调数据展示。 二、Exporter 概念 数据导出是 web 应用中常见的需求,例如生成 CSV、Excel 或 PDF 文件供用户下载...
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
在这个图片分享项目中,模型可能包括`User`(用户)、`Image`(图片)等,视图则展示图片和用户界面,控制器处理用户的请求和响应。 3. **Sign标签**: "Sign"可能是项目的登录或注册模块,它涉及用户认证和授权。...
在“Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)”中,包含了Rails从3.0到4.0各个主要版本的源代码,这些版本的变迁反映了Rails框架在不同阶段的发展和改进。 1. Rails 3.0: Rails 3是重大升级,引入了...
在Ruby on Rails(Rails)框架中,开发人员经常需要实现各种用户交互功能,例如三级联动选择,这在处理如中国省市区这样的地理数据时尤其常见。这篇博客文章“Rails中应用Ext.tree:以中国的省市地区三级联动选择为...
在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...
`weixin_rails_middleware` 是基于 Ruby 的 Rack 技术构建的,它能够插入到 Rails 应用的请求处理流程中。当收到微信服务器发来的请求时,中间件会自动处理这些请求,如验证签名、解析XML数据,并提供相应的响应。 ...
- **配置**:在`config/routes.rb`文件中添加新的路由规则,例如`get 'new_route' => 'controller#action'`。 - **效果**:这将在应用中增加一个新的URL路径,指向指定控制器的动作。 #### 七、渲染视图 - **方法*...
4. **错误处理**:在与Solr通信过程中,可能会遇到网络故障、索引错误等问题,源码中应有相应的异常处理机制,确保应用的健壮性。 此外,深入研究源码,我们可以学习到以下几点: 1. **Solr与Rails的交互机制**:...
Ruby on Rails,简称Rails,是基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在使开发过程更加简洁高效。这个“ruby on rails 教程源码”很可能是为了辅助学习者深入理解Rails的...
延迟加载整个血腥路由,因此应用程序可以快速启动:sign_of_the_horns:route_lazy_routes route_lazy_routes是一个邪恶的Rails插件,它延迟加载整个血腥路由,直到服务器获得第一个请求,因此应用程序可以旋转快起来...
对Rails的扩展,以允许使用绕道而行,返回简单的工作流浏览器导航。 特征 将您的“ link_to”行切换为“ detour_to”,并将您的控制器“ redirect_to”切换为“ back_or_redirect_to”,以允许用户从其来访者返回。 ...
在您的config/initializers/rails_admin.rb初始化程序中添加配置: RailsAdmin . config do | config | config . model Post do list do sort_by :position # Add Default sorting sort_reverse false # sort p
Model负责处理数据和业务逻辑,View负责展示用户界面,Controller作为两者之间的桥梁,处理用户请求并协调Model和View。 3. **路由(Routing)**:Rails的路由系统将HTTP请求映射到相应的控制器方法。通过配置...
持续移动且不破坏事物 :factory: :building_construction: :construction: :construction_worker: 正在建设中-请稍后再回来!
主存储库已移至gitlab,所有新代码将在其中: 它的外观和感觉完全类似于但是使用了jQuery Nested Sortable和或而不是Nestable和Ancestry 。 与和awesome_nested_set一起使用。 奖励功能: 对带有rails_admin_...
允许您使用为Rails应用程序的前端供电。 是将前端工具像Ruby一样进行编程,纯属喜悦! :smiling_face_with_heart-eyes: 或在运行的检查。 产品特点 :high_voltage: :light_bulb: 即时服务器启动 :high_voltage: ...
在Rails应用程序的根目录中,运行: rails_best_practices . 或用于HTML输出: rails_best_practices -f html . 默认情况下,rails_best_practices将解析vendor , spec , test和features目录中的代码。 排除目录...
2. **控制器(Controllers)**:控制器处理用户请求,调用模型方法,并向视图发送数据。购物车相关的控制器可能包括`ProductsController`(用于展示商品)、`CartsController`(处理购物车操作)和`...
在Rails中,`模型`负责处理数据和业务逻辑,`视图`负责展示用户界面,而`控制器`则作为模型和视图之间的桥梁,处理用户请求并协调它们之间的交互。Rails的许多特性,如ActiveRecord(ORM)、ActiveModel、Action...