`
jlaky
  • 浏览: 42860 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Rails请求的生命周期

阅读更多

之前在csdn写了不少关于Rails的笔记,不过觉得一个文件一个文件来读不够有条理,现在可以从更加实用和课题式的角度来读Rails代码。

 

以WEBrick为例子,WEBrick的请求处理代码如下:

 

  def service(req, res) #:nodoc:
    unless handle_file(req, res) # 如果不是处理文件请求
      begin
        REQUEST_MUTEX.lock unless ActionController::Base.allow_concurrency
        unless handle_dispatch(req, res)
          raise WEBrick::HTTPStatus::NotFound, "`#{req.path}' not found."
        end
      ensure
        unless ActionController::Base.allow_concurrency
          REQUEST_MUTEX.unlock if REQUEST_MUTEX.locked?
        end
      end
    end
  end

 

处理html请求,进入handle_dispatch方法

 

  def handle_dispatch(req, res, origin = nil) #:nodoc:
    data = StringIO.new
    Dispatcher.dispatch(
      CGI.new("query", create_env_table(req, origin), StringIO.new(req.body || "")), 
      ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, 
      data
    )
    
    header, body = extract_header_and_body(data) #从返回的data中获取相应header和body

    set_charset(header)
    assign_status(res, header)
    res.cookies.concat(header.delete('set-cookie') || [])
    header.each { |key, val| res[key] = val.join(", ") }
    
    res.body = body
    return true
  rescue => err
    p err, err.backtrace
    return false
  end

 

    def extract_header_and_body(data)
      data.rewind
      data = data.read

      raw_header, body = *data.split(/^[\xd\xa]{2}/on, 2)
      header = WEBrick::HTTPUtils::parse_header(raw_header)
      
      return header, body
    end
 

 

ActionController::Dispatcher里的调用过程如下:

 

      def dispatch(cgi = nil, session_options = CgiRequest::DEFAULT_SESSION_OPTIONS, output = $stdout)
        new(output).dispatch_cgi(cgi, session_options)
      end

    def dispatch_cgi(cgi, session_options)
      if cgi ||= self.class.failsafe_response(@output, '400 Bad Request') { CGI.new } #确保能生成response对象
        @request = CgiRequest.new(cgi, session_options)
        @response = CgiResponse.new(cgi)
        dispatch
      end
    rescue Exception => exception
      failsafe_rescue exception
    end

 

调用dispatch方法

 

这里有两个钩子方法before_dispatch和after_dispatch

    def dispatch
      @@guard.synchronize do
        begin
          run_callbacks :before_dispatch
          handle_request
        rescue Exception => exception
          failsafe_rescue exception
        ensure
          run_callbacks :after_dispatch, :enumerator => :reverse_each
        end
      end
    end 

 

处理单个请求

      def handle_request
        @controller = Routing::Routes.recognize(@request)
        @controller.process(@request, @response).out(@output)
      end

 

调用ActionController的process方法,process里面调用了一系列方法

 

      # Extracts the action_name from the request parameters and performs that action.
      def process(request, response, method = :perform_action, *arguments) #:nodoc:
        initialize_template_class(response)
        assign_shortcuts(request, response)
        initialize_current_url
        assign_names
        forget_variables_added_to_assigns

        log_processing
        send(method, *arguments)

        assign_default_content_type_and_charset

        response.request = request
        response.prepare! unless component_request?
        response
      ensure
        process_cleanup
      end
 

send(method,*arguments)就是调用当前controller对应的action方法,

 

分享到:
评论

相关推荐

    Ruby on Rails源代码

    Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高...同时,这也有助于理解Web开发的整个生命周期,包括数据库设计、前端交互和服务器响应。

    Rails入门教程一(翻译).pdf

    模型部分会涉及ActiveRecord的生命周期,包括创建、读取、更新和删除(CRUD)操作,以及关联(Associations)如一对一、一对多、多对多等,这些关联让数据间的复杂关系得以轻松管理。 此外,教程还会涉及表单...

    Ruby on Rails 指南 v5.0.1 中文版

    - **回调**:解释ActiveRecord中可用的生命周期回调,以及如何利用这些回调增强模型的功能。 - **迁移**:介绍如何使用迁移来管理和维护数据库结构的变化。 #### ActiveRecord迁移 - **迁移概述**:解释迁移的概念...

    Ruby on Rails Web开发学习实录随书光盘(源代码).

    通过学习和实践本光盘中的源代码,你可以逐步掌握Ruby on Rails的开发技巧,理解Web应用的生命周期,从而提升你的Web开发能力。记得结合书籍中的理论知识,与源代码相结合,理论联系实际,这样才能更好地吸收和运用...

    ajax-rails

    4. **Ajax请求的生命周期**:在Rails中,一个Ajax请求通常涉及点击一个链接或提交表单,接着UJS驱动拦截事件,发起Ajax请求。服务器处理请求后,返回的JavaScript代码可以更新页面,无需整体刷新。 5. **模板和局部...

    Agile Web Development with Rails, 4th Edition, Rails 3.1

    - **定义**:敏捷开发是一种以人为核心、迭代、循序渐进的开发方法,在项目开发过程的全生命周期中,以自适应的流程灵活应对变化,持续和快速地交付有价值的高质量产品。 - **核心价值观**:个体和交互胜过流程和...

    Ajax on Rails

    4. **Ajax回调**:在Rails中,可以通过定义`.ajaxStart`, `.ajaxStop`, `.ajaxSuccess`, `.ajaxError`等jQuery事件处理函数来控制Ajax请求的生命周期。 5. **创建Ajax动作**:在Rails控制器中,可以为Ajax请求创建...

    Rails相关电子书汇总二

    5. **控制器**:处理HTTP请求并调用模型和视图,理解控制器的生命周期和动作是理解Rails工作流的关键。 6. **测试**:Rails鼓励TDD(测试驱动开发),包括了解RSpec、Minitest等测试工具,编写单元测试和集成测试。...

    ember-lifeline:Ember插件,用于管理对象中异步行为的生命周期

    这使得JavaScript和Ember开发与Rails开发不同,Rails开发的原因是请求的生命周期很短,并且每个请求之后都要处理环境。 与传统的服务器端Web开发相比,它使Ember开发更像iOS或视频游戏开发。 该插件介绍了几种实用...

    使用Rails、Vue、GraphQL和Devise进行令牌身份验证_Rub.zip

    令牌有生命周期,过期后需要重新获取。这种机制提高了安全性,因为每次请求都需要验证。 实现步骤: 1. **安装和配置Rails**:首先,创建一个新的Rails项目,然后添加`devise`和`devise_token_auth` gem到Gemfile...

    Rails应用程序样本AWSOpsWorksRailsDemoApp.zip

    Amazon Web Services(AWS)的OpsWorks是云中的自动化运维服务,它提供了对基础设施和应用程序生命周期管理的精细控制。OpsWorks支持多种计算服务,如EC2实例,并且能够与Chef和 Puppet等配置管理工具集成,简化了...

    Ruby-ActionPack的Action缓存在Rails40中从核心移除

    在Ruby on Rails框架中,ActionPack是一个核心组件,它包含了控制器、路由以及处理HTTP请求和响应的工具。...同时,理解不同缓存策略的优缺点以及它们在缓存生命周期中的角色,对于构建高性能的Rails应用至关重要。

    在Ruby on Rails中使用Rails Active Resource的教程

    它的作用类似于一个简化版的远程数据访问层,通过远程资源提供的Web服务API,能够轻松地将资源数据映射为本地的Ruby对象,并且可以通过ActiveRecord提供的生命周期回调方法来处理数据的保存和同步。 在实际开发中,...

    A Guide to Testing the Rails.pdf

    ### 三、测试生命周期与Assert方法 #### 3.1 测试用例生命周期 测试用例从创建、初始化、执行到清理,经历一系列阶段。理解这一流程有助于更有效地编写和管理测试。 #### 3.2 Test/Unit的Assert方法 Assert方法...

    Ruby On Rails

    迁移(Migrations)则用于管理数据库结构的变化,允许你在应用的生命周期中方便地添加、修改或删除表。 TDD(测试驱动开发)在RoR中受到推崇,它提倡先写测试,再编写满足测试的代码。RoR内置了Test::Unit和RSpec等...

    Ruby-HttpLogHTTP请求日志输出

    总的来说,HttpLog是Ruby开发中一个非常实用的库,它能够帮助开发者更好地理解HTTP请求的生命周期,从而提升开发效率和应用程序的可靠性。通过深入利用HttpLog提供的功能,你可以更好地监控你的应用,找出性能瓶颈,...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    第20章 ActiveRecord第三部分:对象生命周期 295 20.1 校验 295 20.2 回调 303 20.3 高级属性 308 20.4 事务 311 第21章 ActionController:路由与URL 317 21.1 基础 317 21.2 请求的路由 318 21.3 基于资源的路由 ...

    微信小程序-对微信设计指南中的Web设计和小程序基础控件库的练习

    首先看下 Page 生命周期图, 这张图来自于微信小程序的官方文档。 截取 onReady 到 onHide 之间的图: 从截图中我们可以看到在微信小程序的生命周期中,它大部分时间干的事情是 AppSerivce Thread 向 View Thread ...

    Ruby-DeclarativeAuthorization一个授权Rails插件在同一个地方使用声明式DSL用于指定授权规则

    这种设计使得权限检查贯穿于整个请求生命周期。 ### 四、标签解析 "Ruby开发-身份验证和OAuth"标签表明,这个插件是Ruby开发的一部分,关注的是身份验证和OAuth(开放授权)相关问题。虽然Declarative ...

Global site tag (gtag.js) - Google Analytics