`
fantaxy025025
  • 浏览: 1330162 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Rails源码阅读(七)ActionController::Dispatcher_用户请求在rails中的处理流程(2)

 
阅读更多

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-源码.rar

    在 Rails 应用中,模型负责数据操作,视图负责展示,控制器则作为两者之间的桥梁,处理用户请求并协调数据展示。 二、Exporter 概念 数据导出是 web 应用中常见的需求,例如生成 CSV、Excel 或 PDF 文件供用户下载...

    Rails的精简版本Rails::API.zip

    Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...

    Rails项目源代码

    在这个图片分享项目中,模型可能包括`User`(用户)、`Image`(图片)等,视图则展示图片和用户界面,控制器处理用户的请求和响应。 3. **Sign标签**: "Sign"可能是项目的登录或注册模块,它涉及用户认证和授权。...

    Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)

    在“Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)”中,包含了Rails从3.0到4.0各个主要版本的源代码,这些版本的变迁反映了Rails框架在不同阶段的发展和改进。 1. Rails 3.0: Rails 3是重大升级,引入了...

    Rails中应用Ext.tree:以中国的省市地区三级联动选择为例

    在Ruby on Rails(Rails)框架中,开发人员经常需要实现各种用户交互功能,例如三级联动选择,这在处理如中国省市区这样的地理数据时尤其常见。这篇博客文章“Rails中应用Ext.tree:以中国的省市地区三级联动选择为...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...

    weixin_rails_middleware, 微信集成 ruby weixin_rails_middleware for integration weixin..zip

    `weixin_rails_middleware` 是基于 Ruby 的 Rack 技术构建的,它能够插入到 Rails 应用的请求处理流程中。当收到微信服务器发来的请求时,中间件会自动处理这些请求,如验证签名、解析XML数据,并提供相应的响应。 ...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **配置**:在`config/routes.rb`文件中添加新的路由规则,例如`get 'new_route' =&gt; 'controller#action'`。 - **效果**:这将在应用中增加一个新的URL路径,指向指定控制器的动作。 #### 七、渲染视图 - **方法*...

    bhl_rails_solr-源码.rar

    4. **错误处理**:在与Solr通信过程中,可能会遇到网络故障、索引错误等问题,源码中应有相应的异常处理机制,确保应用的健壮性。 此外,深入研究源码,我们可以学习到以下几点: 1. **Solr与Rails的交互机制**:...

    ruby on rails 教程源码

    Ruby on Rails,简称Rails,是基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在使开发过程更加简洁高效。这个“ruby on rails 教程源码”很可能是为了辅助学习者深入理解Rails的...

    Ruby on Rails的启动时间助推器,可阻止加载整个流血路线,因此应用程序可以快速启动:sign_of_the_horns:-Ruby开发

    延迟加载整个血腥路由,因此应用程序可以快速启动:sign_of_the_horns:route_lazy_routes route_lazy_routes是一个邪恶的Rails插件,它延迟加载整个血腥路由,直到服务器获得第一个请求,因此应用程序可以旋转快起来...

    simple_workflow:添加绕路并返回到Ruby On Rails中先前工作流的方法

    对Rails的扩展,以允许使用绕道而行,返回简单的工作流浏览器导航。 特征 将您的“ link_to”行切换为“ detour_to”,并将您的控制器“ redirect_to”切换为“ back_or_redirect_to”,以允许用户从其来访者返回。 ...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    在您的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

    For-Rails-Beginners::Japanese_symbol_for_beginner:Ruby on Rails的初学者有福了

    Model负责处理数据和业务逻辑,View负责展示用户界面,Controller作为两者之间的桥梁,处理用户请求并协调Model和View。 3. **路由(Routing)**:Rails的路由系统将HTTP请求映射到相应的控制器方法。通过配置...

    todds_blog:Basic Rails博客:man_technologist::railway_track::writing_hand:

    持续移动且不破坏事物 ‍:factory: :building_construction: :construction: :construction_worker: 正在建设中-请稍后再回来!

    rails_admin_nested_set:用于编辑rails_admin的嵌套集的界面

    主存储库已移至gitlab,所有新代码将在其中: 它的外观和感觉完全类似于但是使用了jQuery Nested Sortable和或而不是Nestable和Ancestry 。 与和awesome_nested_set一起使用。 奖励功能: 对带有rails_admin_...

    vite_rails:Rails中的:high_voltage:Vite.js,为您JavaScript体验带来欢乐

    允许您使用为Rails应用程序的前端供电。 是将前端工具像Ruby一样进行编程,纯属喜悦! :smiling_face_with_heart-eyes: 或在运行的检查。 产品特点 :high_voltage: :light_bulb: 即时服务器启动 :high_voltage: ...

    rails_best_practices:Rails项目的代码度量工具

    在Rails应用程序的根目录中,运行: rails_best_practices . 或用于HTML输出: rails_best_practices -f html . 默认情况下,rails_best_practices将解析vendor , spec , test和features目录中的代码。 排除目录...

    shopping_card_rails-源码.rar

    2. **控制器(Controllers)**:控制器处理用户请求,调用模型方法,并向视图发送数据。购物车相关的控制器可能包括`ProductsController`(用于展示商品)、`CartsController`(处理购物车操作)和`...

    基于ruby on rails开发示例源码

    在Rails中,`模型`负责处理数据和业务逻辑,`视图`负责展示用户界面,而`控制器`则作为模型和视图之间的桥梁,处理用户请求并协调它们之间的交互。Rails的许多特性,如ActiveRecord(ORM)、ActiveModel、Action...

Global site tag (gtag.js) - Google Analytics