之前在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(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高...同时,这也有助于理解Web开发的整个生命周期,包括数据库设计、前端交互和服务器响应。
模型部分会涉及ActiveRecord的生命周期,包括创建、读取、更新和删除(CRUD)操作,以及关联(Associations)如一对一、一对多、多对多等,这些关联让数据间的复杂关系得以轻松管理。 此外,教程还会涉及表单...
- **回调**:解释ActiveRecord中可用的生命周期回调,以及如何利用这些回调增强模型的功能。 - **迁移**:介绍如何使用迁移来管理和维护数据库结构的变化。 #### ActiveRecord迁移 - **迁移概述**:解释迁移的概念...
通过学习和实践本光盘中的源代码,你可以逐步掌握Ruby on Rails的开发技巧,理解Web应用的生命周期,从而提升你的Web开发能力。记得结合书籍中的理论知识,与源代码相结合,理论联系实际,这样才能更好地吸收和运用...
4. **Ajax请求的生命周期**:在Rails中,一个Ajax请求通常涉及点击一个链接或提交表单,接着UJS驱动拦截事件,发起Ajax请求。服务器处理请求后,返回的JavaScript代码可以更新页面,无需整体刷新。 5. **模板和局部...
- **定义**:敏捷开发是一种以人为核心、迭代、循序渐进的开发方法,在项目开发过程的全生命周期中,以自适应的流程灵活应对变化,持续和快速地交付有价值的高质量产品。 - **核心价值观**:个体和交互胜过流程和...
4. **Ajax回调**:在Rails中,可以通过定义`.ajaxStart`, `.ajaxStop`, `.ajaxSuccess`, `.ajaxError`等jQuery事件处理函数来控制Ajax请求的生命周期。 5. **创建Ajax动作**:在Rails控制器中,可以为Ajax请求创建...
5. **控制器**:处理HTTP请求并调用模型和视图,理解控制器的生命周期和动作是理解Rails工作流的关键。 6. **测试**:Rails鼓励TDD(测试驱动开发),包括了解RSpec、Minitest等测试工具,编写单元测试和集成测试。...
这使得JavaScript和Ember开发与Rails开发不同,Rails开发的原因是请求的生命周期很短,并且每个请求之后都要处理环境。 与传统的服务器端Web开发相比,它使Ember开发更像iOS或视频游戏开发。 该插件介绍了几种实用...
令牌有生命周期,过期后需要重新获取。这种机制提高了安全性,因为每次请求都需要验证。 实现步骤: 1. **安装和配置Rails**:首先,创建一个新的Rails项目,然后添加`devise`和`devise_token_auth` gem到Gemfile...
Amazon Web Services(AWS)的OpsWorks是云中的自动化运维服务,它提供了对基础设施和应用程序生命周期管理的精细控制。OpsWorks支持多种计算服务,如EC2实例,并且能够与Chef和 Puppet等配置管理工具集成,简化了...
在Ruby on Rails框架中,ActionPack是一个核心组件,它包含了控制器、路由以及处理HTTP请求和响应的工具。...同时,理解不同缓存策略的优缺点以及它们在缓存生命周期中的角色,对于构建高性能的Rails应用至关重要。
它的作用类似于一个简化版的远程数据访问层,通过远程资源提供的Web服务API,能够轻松地将资源数据映射为本地的Ruby对象,并且可以通过ActiveRecord提供的生命周期回调方法来处理数据的保存和同步。 在实际开发中,...
### 三、测试生命周期与Assert方法 #### 3.1 测试用例生命周期 测试用例从创建、初始化、执行到清理,经历一系列阶段。理解这一流程有助于更有效地编写和管理测试。 #### 3.2 Test/Unit的Assert方法 Assert方法...
迁移(Migrations)则用于管理数据库结构的变化,允许你在应用的生命周期中方便地添加、修改或删除表。 TDD(测试驱动开发)在RoR中受到推崇,它提倡先写测试,再编写满足测试的代码。RoR内置了Test::Unit和RSpec等...
总的来说,HttpLog是Ruby开发中一个非常实用的库,它能够帮助开发者更好地理解HTTP请求的生命周期,从而提升开发效率和应用程序的可靠性。通过深入利用HttpLog提供的功能,你可以更好地监控你的应用,找出性能瓶颈,...
第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 基于资源的路由 ...
首先看下 Page 生命周期图, 这张图来自于微信小程序的官方文档。 截取 onReady 到 onHide 之间的图: 从截图中我们可以看到在微信小程序的生命周期中,它大部分时间干的事情是 AppSerivce Thread 向 View Thread ...
这种设计使得权限检查贯穿于整个请求生命周期。 ### 四、标签解析 "Ruby开发-身份验证和OAuth"标签表明,这个插件是Ruby开发的一部分,关注的是身份验证和OAuth(开放授权)相关问题。虽然Declarative ...