Rails源码阅读(八)ActionController::Base_用户请求在rails中的处理流程(3)
Rails源码阅读(八)ActionController::Base_用户请求在rails中的处理流程(3)
?
执行流程从路由找到真正要执行的XXXController后,会执行super方法,即ActionController::Base.process方法
?
?
# 返回结果用send_response
? ? ? #send_response的代码
回到请求的入口处:app.call(env).to_a
从这里应该推测出,response应该有to_a方法,返回符合rack标准的接口。
找了找Response里没有,应该去看看其super-class,果然是:
class Response < Rack::Response
在Rack::Response中定义了to_a方法,代码如下:
# Renders according to the same rules as <tt>render</tt>, but returns the result in a string instead # of sending it as the response body to the browser. def render_to_string(options = nil, &block) #:doc: render(options, &block) ensure response.content_type = nil erase_render_results reset_variables_added_to_assigns end这个方法很好用,尤其是在处理js和ajax 的时候,不再需要在controller里面写太多拼凑字符串了,直接用erb模板,就如同写view一样;再例如,需要动态的定制页面生成等给编辑使用,这个时候手写erb不划算。
?
总结:
#1 介绍了XXXController的process方法做了哪些操作以及涉及到的步骤:
new一个当前Controller的实例,调用实例的process方法,
process执行perform_action方法,
perform_action用反射(action名字是路由来的)调用了当前实例的action方法(我们真正编码实现的地方)
之后render,也就是根据页面的得到字符串,状态等信息,response给http的用户
#2 erb页面内容的生成是由@template.render做的。@template是ActionView::Base的实例
这里调用的接力棒到了action_view里
?
?
====结束====
=== ? ? ? ? ? ===
== ? ? ? ? ? ? ? ?==
= ? ? ? ? ? ? ? ? ? ? =
| ? ? ? ? ? ? ? ? ? ? ? |