- 浏览: 239421 次
文章分类
最新评论
-
bluky999:
中间的兼职例子很逗 哈哈哈
tornado: web.py 之 Application -
flingfox63:
学习了,详细,赞个
Ruby变量作用域的类目录结构 -
zhou6711411:
不知是版本问题还是怎么的
class A
...
Ruby变量作用域的类目录结构 -
t284299773:
你在方法中定义方法就相当于在方法中调用lambda!
Ruby变量作用域的类目录结构(补二) -
lnj888:
很是有用 不错Powerpoint converter
一个简单的link_to,ROR到底在背后做了些什么?(未完)
ruby 代码
- 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) #这一步调用perform_action方法,并且传入arguments数组作为参数(虽然perform_action不需要参数)
- assign_default_content_type_and_charset
- response.request = request
- response.prepare! unless component_request?
- response
- ensure
- process_cleanup
- end
初始化视图模板类
java 代码
- def initialize_template_class(response)
- raise "You must assign a template class through ActionController.template_class= before processing a request" unless @@template_class
- response.template = ActionView::Base.new(view_paths, {}, self) #注意,ActionView这个时候出现了,传入本controller对应的view模板的路径
- response.template.extend self.class.master_helper_module
- response.redirected_to = nil
- @performed_render = @performed_redirect = false #标记render和redirect事件都没有发生
- end
step 2:
ruby 代码
- def assign_shortcuts(request, response)
- @_request, @_params, @_cookies = request, request.parameters, request.cookies
- @_response = response
- @_response.session = request.session
- @_session = @_response.session
- @template = @_response.template
- @assigns = @_response.template.assigns
- @_headers = @_response.headers
- end
step 3:
ruby 代码
- def initialize_current_url
- @url = UrlRewriter.new(request, params.clone)
- end
step 4:
经过了这一步,就可以通过调用action_name来获得action的名称
ruby 代码
- def assign_names
- @action_name = (params['action'] || 'index') #取得当前action的名称,如果没有指定action,则默认action为index
- end
step 5:
ruby 代码
- def forget_variables_added_to_assigns
- @variables_added = nil
- end
step 6:
ruby 代码
- def log_processing
- if logger
- logger.info "\n\nProcessing #{controller_class_name}\##{action_name} (for #{request_origin}) [#{request.method.to_s.upcase}]"
- logger.info " Session ID: #{@_session.session_id}" if @_session and @_session.respond_to?(:session_id)
- logger.info " Parameters: #{respond_to?(:filter_parameters) ? filter_parameters(params).inspect : params.inspect}"
- end
- end
step 7:
ruby 代码
- 默认对待一个请求的方式是perform_action
- 可以看到对待一个action,rails的处理方式是:
- 1。假设action存在,则执行action代码,如果action代码内没有调用过render方法,就调用render方法
- 2。如果action不存在,则查找method_missing方法,若方法存在,调用之,如果action代码内没有调用过render方法,就调用render方法
- 3。如果视图模板存在而且模板是public的,则直接调用render方法渲染
- 4。以上都不满足,抛出UnkownAction异常。
- def perform_action
- if self.class.action_methods.include?(action_name)
- send(action_name)
- render unless performed?
- elsif respond_to? :method_missing
- send(:method_missing, action_name)
- render unless performed?
- elsif template_exists? && template_public?
- render
- else
- raise UnknownAction, "No action responded to #{action_name}", caller
- end
- end
- def action_methods
- self.class.action_methods
- end
- def self.action_methods
- @action_methods ||= Set.new(public_instance_methods - hidden_actions)
- end
step 8:
ruby 代码
- step 8:
- def assign_default_content_type_and_charset
- response.content_type ||= Mime::HTML
- response.charset ||= self.class.default_charset unless sending_file?
- end
- 最后,一个process完成后返回一个response
- 由这个process过程引出的,顺便简单看一下render方法
- def render(options = nil, &block) #:doc:
- raise DoubleRenderError, "Can only render or redirect once per action" if performed?
- #可以看出来,在响应action的过程中,如果没有在action中使用过render方法,实际上每次默认都是调用render_for_file方法
- #参数中使用default_template_name方法获得与当前action同名的视图模板的相对路径
- if options.nil?
- return render_for_file(default_template_name, nil, true)
- else
- #render的参数只能是:update或者一个hash
- if options == :update
- options = { :update => true }
- elsif !options.is_a?(Hash)
- raise RenderError, "You called render with invalid options : #{options}"
- end
- end
- if content_type = options[:content_type]
- response.content_type = content_type.to_s
- end
- if location = options[:location]
- response.headers["Location"] = url_for(location)
- end
- 指定不同的渲染方式
- if text = options[:text]
- render_for_text(text, options[:status])
- else
- if file = options[:file]
- render_for_file(file, options[:status], options[:use_full_path], options[:locals] || {})
- elsif template = options[:template]
- render_for_file(template, options[:status], true)
- elsif inline = options[:inline]
- add_variables_to_assigns
- render_for_text(@template.render_template(options[:type] || :erb, inline, nil, options[:locals] || {}), options[:status])
- #当在action中显式调用render方式时会执行到此分支
- elsif action_name = options[:action]
- template = default_template_name(action_name.to_s)
- #根据:layout来决定调用那个方法
- if options[:layout] && !template_exempt_from_layout?(template)
- render_with_a_layout(:file => template, :status => options[:status], :use_full_path => true, :layout => true)
- else
- render_with_no_layout(:file => template, :status => options[:status], :use_full_path => true)
- end
- elsif xml = options[:xml]
- response.content_type = Mime::XML
- render_for_text(xml.respond_to?(:to_xml) ? xml.to_xml : xml, options[:status])
- elsif json = options[:json]
- json = "#{options[:callback]}(#{json})" unless options[:callback].blank?
- response.content_type = Mime::JSON
- render_for_text(json, options[:status])
- elsif partial = options[:partial]
- partial = default_template_name if partial == true
- add_variables_to_assigns
- if collection = options[:collection]
- render_for_text(
- @template.send(:render_partial_collection, partial, collection,
- options[:spacer_template], options[:locals]), options[:status]
- )
- else
- render_for_text(
- @template.send(:render_partial, partial,
- ActionView::Base::ObjectWrapper.new(options[:object]), options[:locals]), options[:status]
- )
- end
- elsif options[:update]
- add_variables_to_assigns
- @template.send :evaluate_assigns
- generator = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(@template, &block)
- response.content_type = Mime::JS
- render_for_text(generator.to_s)
- elsif options[:nothing]
- # Safari doesn't pass the headers of the return if the response is zero length
- render_for_text(" ", options[:status])
- else
- render_for_file(default_template_name, options[:status], true)
- end
- end
- end
发表评论
-
(ZZ)Ror on svn
2007-12-20 19:34 1468正好需要,zz过来,抄袭自:http://www.surui. ... -
用GetText来进行ROR的国际化和本地化
2007-11-22 15:17 1409IBM developerWorks上的一篇文章,直接贴地址, ... -
advanced act_as_solr
2007-10-31 19:40 1758原文出处:http://www.quarkruby.com/2 ... -
act_as_solr
2007-10-31 19:39 1936原文出处:http://www.quarkruby.com/2 ... -
Ambition
2007-10-31 19:36 1300原文出处:http://railsontherun.com/2 ... -
使用Inkscape提供自己的pdf服务
2007-10-31 19:34 1496原文出处:http://www.thesatya.com/bl ... -
给will_paginate加上ajax效果
2007-10-31 19:30 2109原文出处:http://railsontherun.com/2 ... -
使用rails制作图表
2007-10-31 19:21 2756原文出处:http://www.railsontherun.c ... -
如果定制attachment_fu上传文件的路径和文件名
2007-10-31 16:59 2711原文出处:http://the.railsi.st/2007/ ... -
attachment_fu使用指南
2007-10-31 16:56 3164原文出处:http://clarkware.com/cgi/b ... -
(ZZ)Cache in Rails
2007-09-25 15:49 1468很经典的文章,留在blog里面做个收藏 Ruby on Rai ... -
(ZZ)Ruby on Rails Security Guide
2007-09-24 21:28 2610Ruby on Rails Security Gui ... -
学到三招
2007-09-24 01:54 1356第一招:用ruby-debug来调试rails程序 具体使用方 ... -
在线查看rails代码和edge rails api的网址,备份,以免忘记
2007-09-14 18:38 1279Edge Rails API: http://caboo.se ... -
总是看到returning,这到底是个什么东东,查了一下找到了源代码
2007-09-14 18:37 1339A Ruby-ized realization of the ... -
一个简单的link_to,ROR到底在背后做了些什么?(未完)
2007-09-14 18:20 3415滥用link_to会造成ror程序 ... -
学到关于include的一点儿知识
2007-08-23 18:09 1115ruby 代码 module Test ... -
在一个controller中render另外一个controller中view的时候出现问题
2007-08-21 18:27 2124我想在posts这个controller中的show.rh ... -
因为Rjs试用NetBeans
2007-06-20 09:44 1087因为昨天看Rails Recipe的时候提到了rjs,于是四处 ...
相关推荐
过程行动组(PAT)工作记录 process action team (PAT) working record 过程定义文件试验结果评定表 evaluation form for pilot result of process definition document 过程状态季度报告模板 process status ...
通过一个比较实际的应用例子,让读者体会到在某些领域,以事件为中心建模的解决方案是更好的方法。更自然、更松耦合,更具扩展性。 Part 1. 没啥可说的。与request-response pattern interaction做了对比。EDA大...
温度对ULSI硅衬底化学机械抛光去除速率及动力学的控制研究,刘玉岭,牛新环,本文对材料表面化学机械高精密加工的动力学过程及控制过程进行了深入的研究。根据大量实验总结出了CMP的七个动力学过程,在ULSI衬��
一个process definition代表了一个正式的业务流程,它以一个流程图为基础。这个流程图由许多node和transition组成。每个node在这个流程图里都有着各自特殊的类型,这些不同的类型决定了node在运行时的不同行为。一个...
通过我们已经学过的知识,你可以编写一个最简单的程序输出一个也许是程序世界中最有名的词语: echo "Hello World!"; ?> First PHP page // Single line C++ style comment /* printing the message */ ...
To use Action, subclass and overwrite the process() method. The ActionServlet (Command) passes the parameterized classes to ActionForm using the perform() method. Again, no more dreadful request....
training success, began the real speech recognition for user issues different voice commands, robots perform different actions, in ultrasonic ranging action process, an obstacle to stop the action ...
创建了一个类的对象 WindowInputEvent Receiver InputEventRe ceiver的构造 函数 WindowInputEventReceiver extends InputEventReceiver nativeInit InputEventReceiver.cpp nativeInit android_view_InputE ...
BIQS的概要 BIQS 评审打分方式 审核打分方法 用红、黄、绿三种颜色代表每一个要素的结果,最终结果计算绿色项的百分比 绿色Green:供应商有成熟的/好的质量系统或过程,并得到有效执行。 黄色Yellow:供应商有相关...
3. 构建一个简单应用....................................................................................60 3.1. 被支柱支撑的支柱......................................................................
这些危害往往降临在那些麻痹大意、自以为是的那些人身上,所以,为了你、也为了疼你、爱你的亲人,为了大家能有一个健康愉悦的网络环境,在此有必要向同学们讲一讲怎么来预防和应对网络危害: 一,网络不良信息的...
编号:SM-ZD-44758 网络安全整改措施Through the process agreement to achieve a unified action policy for different people, so as to coordinate action, reduce blindness, and make the work orderly....
3. 构建一个简单应用....................................................................................60 3.1. 被支柱支撑的支柱............................................................................
这个程序中有一个细节使用了一些技巧:通常,建立一个动态链接库时,链接器将静态数据标记为非共享,也就是说,每一个调用DLL的进程都获得自己的数据拷贝------在本程序中是g_hHookKbd、g_hHookMouse和g_...
启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init()) 至此start_kernel()结束,基本的核心环境已经建立起来了。 对于I386平台 i386平台上的内核启动过程与此基本...
RUP(Rational Unified Process)软件统一过程,XP(Extreme Programming)极端编程,这些通常被叫做“过程方法”,是一种软件项目实施过程的方法论,它是针对软件项目的实施过程提出的方法策略。也是另一个角度的...
在这种方式下,只需添加一个result-type,将原有的result中type改为“streamx”,其他一律不变,在这种情况下,点击“取消”的同时也关闭了流,不会再报出该异常。 之后的执行“取消”后的结果如下:(配置了"log4...
ISO-----是一个非官方和世界各地规范化的国际性代表机构.它努力于推行产品或效力规范一体化及相关的活动,促进国际商业贸易展开. ISO于1947年02月23日成立于瑞士的日内瓦. 规范制定区分有各TC技术委员会制定. 如: ...