`

一个action的process过程

    博客分类:
  • RoR
阅读更多
ruby 代码
 
  1. def process(request, response, method = :perform_action, *arguments) #:nodoc:  
  2.    initialize_template_class(response)  
  3.    assign_shortcuts(request, response)  
  4.    initialize_current_url  
  5.    assign_names  
  6.    forget_variables_added_to_assigns  
  7.   
  8.    log_processing  
  9.    send(method, *arguments) #这一步调用perform_action方法,并且传入arguments数组作为参数(虽然perform_action不需要参数)  
  10.   
  11.    assign_default_content_type_and_charset  
  12.   
  13.    response.request = request  
  14.    response.prepare! unless component_request?  
  15.    response  
  16.  ensure  
  17.    process_cleanup  
  18.  end  
step 1:
初始化视图模板类
java 代码
 
  1. def initialize_template_class(response)  
  2.   raise "You must assign a template class through ActionController.template_class= before processing a request" unless @@template_class  
  3.   
  4.   response.template = ActionView::Base.new(view_paths, {}, self) #注意,ActionView这个时候出现了,传入本controller对应的view模板的路径  
  5.   response.template.extend self.class.master_helper_module  
  6.   response.redirected_to = nil  
  7.   @performed_render = @performed_redirect = false #标记render和redirect事件都没有发生  
  8. end  

step 2:
ruby 代码
 
  1. def assign_shortcuts(request, response)  
  2.   @_request@_params@_cookies = request, request.parameters, request.cookies  
  3.   
  4.   @_response         = response  
  5.   @_response.session = request.session  
  6.   
  7.   @_session = @_response.session  
  8.   @template = @_response.template  
  9.   @assigns  = @_response.template.assigns  
  10.   
  11.   @_headers = @_response.headers  
  12. end  

step 3:
ruby 代码
 
  1. def initialize_current_url  
  2.   @url = UrlRewriter.new(request, params.clone)  
  3. end  

step 4:
经过了这一步,就可以通过调用action_name来获得action的名称
ruby 代码
 
  1. def assign_names  
  2.    @action_name = (params['action'] || 'index') #取得当前action的名称,如果没有指定action,则默认action为index  
  3.  end  

step 5:
ruby 代码
 
  1. def forget_variables_added_to_assigns  
  2.   @variables_added = nil  
  3. end  


step 6:
ruby 代码
 
  1. def log_processing  
  2.   if logger  
  3.     logger.info "\n\nProcessing #{controller_class_name}\##{action_name} (for #{request_origin}) [#{request.method.to_s.upcase}]"  
  4.     logger.info "  Session ID: #{@_session.session_id}" if @_session and @_session.respond_to?(:session_id)  
  5.     logger.info "  Parameters: #{respond_to?(:filter_parameters) ? filter_parameters(params).inspect : params.inspect}"  
  6.   end  
  7. end  

step 7:
ruby 代码
 
  1. 默认对待一个请求的方式是perform_action  
  2. 可以看到对待一个action,rails的处理方式是:  
  3. 1。假设action存在,则执行action代码,如果action代码内没有调用过render方法,就调用render方法  
  4. 2。如果action不存在,则查找method_missing方法,若方法存在,调用之,如果action代码内没有调用过render方法,就调用render方法  
  5. 3。如果视图模板存在而且模板是public的,则直接调用render方法渲染  
  6. 4。以上都不满足,抛出UnkownAction异常。  
  7.       def perform_action  
  8.         if self.class.action_methods.include?(action_name)  
  9.           send(action_name)  
  10.           render unless performed?  
  11.         elsif respond_to? :method_missing  
  12.           send(:method_missing, action_name)  
  13.           render unless performed?  
  14.         elsif template_exists? && template_public?  
  15.           render  
  16.         else  
  17.           raise UnknownAction, "No action responded to #{action_name}", caller  
  18.         end  
  19.       end  
  20.   
  21.       def action_methods  
  22.         self.class.action_methods  
  23.       end  
  24.   
  25.       def self.action_methods  
  26.         @action_methods ||= Set.new(public_instance_methods - hidden_actions)  
  27.       end  

step 8:
ruby 代码
 
  1. step 8:  
  2.       def assign_default_content_type_and_charset  
  3.         response.content_type ||= Mime::HTML  
  4.         response.charset      ||= self.class.default_charset unless sending_file?  
  5.       end  
  6.   
  7. 最后,一个process完成后返回一个response  
  8.   
  9. 由这个process过程引出的,顺便简单看一下render方法  
  10.       def render(options = nil, &block) #:doc:  
  11.         raise DoubleRenderError, "Can only render or redirect once per action" if performed?  
  12.   
  13.     #可以看出来,在响应action的过程中,如果没有在action中使用过render方法,实际上每次默认都是调用render_for_file方法  
  14.     #参数中使用default_template_name方法获得与当前action同名的视图模板的相对路径  
  15.         if options.nil?  
  16.           return render_for_file(default_template_name, niltrue)  
  17.         else  
  18.     #render的参数只能是:update或者一个hash  
  19.           if options == :update  
  20.             options = { :update => true }  
  21.           elsif !options.is_a?(Hash)  
  22.             raise RenderError, "You called render with invalid options : #{options}"  
  23.           end  
  24.         end  
  25.   
  26.         if content_type = options[:content_type]  
  27.           response.content_type = content_type.to_s  
  28.         end  
  29.   
  30.         if location = options[:location]  
  31.           response.headers["Location"] = url_for(location)  
  32.         end  
  33.   
  34.     指定不同的渲染方式  
  35.         if text = options[:text]  
  36.           render_for_text(text, options[:status])  
  37.   
  38.         else  
  39.           if file = options[:file]  
  40.             render_for_file(file, options[:status], options[:use_full_path], options[:locals] || {})  
  41.   
  42.           elsif template = options[:template]  
  43.             render_for_file(template, options[:status], true)  
  44.   
  45.           elsif inline = options[:inline]  
  46.             add_variables_to_assigns  
  47.             render_for_text(@template.render_template(options[:type] || :erb, inline, nil, options[:locals] || {}), options[:status])  
  48.   
  49.     #当在action中显式调用render方式时会执行到此分支  
  50.           elsif action_name = options[:action]  
  51.             template = default_template_name(action_name.to_s)  
  52.     #根据:layout来决定调用那个方法  
  53.             if options[:layout] && !template_exempt_from_layout?(template)  
  54.               render_with_a_layout(:file => template, :status => options[:status], :use_full_path => true:layout => true)                
  55.             else  
  56.               render_with_no_layout(:file => template, :status => options[:status], :use_full_path => true)  
  57.             end              
  58.   
  59.           elsif xml = options[:xml]  
  60.             response.content_type = Mime::XML  
  61.             render_for_text(xml.respond_to?(:to_xml) ? xml.to_xml : xml, options[:status])  
  62.   
  63.           elsif json = options[:json]  
  64.             json = "#{options[:callback]}(#{json})" unless options[:callback].blank?  
  65.             response.content_type = Mime::JSON  
  66.             render_for_text(json, options[:status])  
  67.   
  68.           elsif partial = options[:partial]  
  69.             partial = default_template_name if partial == true  
  70.             add_variables_to_assigns  
  71.   
  72.             if collection = options[:collection]  
  73.               render_for_text(  
  74.                 @template.send(:render_partial_collection, partial, collection,   
  75.                 options[:spacer_template], options[:locals]), options[:status]  
  76.               )  
  77.             else  
  78.               render_for_text(  
  79.                 @template.send(:render_partial, partial,   
  80.                 ActionView::Base::ObjectWrapper.new(options[:object]), options[:locals]), options[:status]  
  81.               )  
  82.             end  
  83.   
  84.           elsif options[:update]  
  85.             add_variables_to_assigns  
  86.             @template.send :evaluate_assigns  
  87.   
  88.             generator = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(@template, &block)  
  89.             response.content_type = Mime::JS  
  90.             render_for_text(generator.to_s)  
  91.   
  92.           elsif options[:nothing]  
  93.             # Safari doesn't pass the headers of the return if the response is zero length  
  94.             render_for_text(" ", options[:status])  
  95.   
  96.           else  
  97.             render_for_file(default_template_name, options[:status], true)  
  98.           end  
  99.         end  
  100.       end  
分享到:
评论
1 楼 lnj888 2010-05-27  
学习了 谢谢哈
ppt converter

相关推荐

    马尔科夫决策过程(Markov Decision Process,简称MDP)是强化学习中的一个核心概念,也是序贯决策的数学模型

    马尔科夫决策过程马尔科夫决策过程(Markov Decision Process,简称MDP)是强化学习中的一个核心概念,也是序贯决策的数学模型,用于描述决策者在不确定环境中进行决策的过程。MDP具有广泛的应用领域,包括资源分配...

    JakeWharton最新力作——Process Phoenix,重启application process.zip

    Process Phoenix是由知名Android开发者Jake Wharton推出的一个开源项目,旨在帮助开发者更加优雅地处理应用程序进程的重启。在Android系统中,应用进程可能会因为各种原因被系统杀死,例如内存不足、系统优化或者...

    process mining

    2. **一致性检查**:过程挖掘的一个关键应用是检查实际流程与预定义的流程规范之间的偏差。通过对事件日志和流程模型进行对比,可以发现流程中的不合规行为、异常路径或瓶颈,这有助于提高流程的合规性和效率。 3. ...

    Process Mining

    《过程挖掘:发现、一致性与业务流程增强》...对于希望利用过程挖掘技术优化业务流程的企业和个人来说,这本书是一个宝贵的资源。通过学习和应用过程挖掘技术,企业可以更有效地诊断问题,优化流程,提高整体运营效率。

    Action-oriented process mining: bridging the gap between insight

    行动导向的过程挖掘(Action-oriented Process Mining)致力于解决这一问题,它旨在建立一个桥梁,连接从事件数据中获取的知识与具体改善流程的实际行动。这一方法不仅关注洞察的生成,更强调这些洞察如何指导实时的...

    Process Mining Data Science in Action.pdf

    《Process Mining Data Science in Action》这本书探讨的主题是图神经网络(GNN)在数据挖掘和机器学习中的应用。近年来,由于非欧几里得数据的增多,如对象间复杂关系和相互依赖的数据,传统的机器学习算法面临挑战...

    Struts2 Request Process Procedure

    Struts2是一个流行的Java web框架,它为开发者提供了一种结构化的方式来构建MVC(Model-View-Controller)应用程序。其请求处理流程是Struts2的核心机制,它决定了当一个HTTP请求到达时,如何被转化为应用程序的动作...

    CMMI文件清单中英文对照表

    过程行动组(PAT)工作记录 process action team (PAT) working record 过程定义文件试验结果评定表 evaluation form for pilot result of process definition document 过程状态季度报告模板 process status ...

    在ESR中创建Process Integration Scenario并在ID自动生成配置

    1. **命名空间的创建**:首先,在ESR的Software Component下创建一个命名空间,作为存放Process Integration Scenario的基础位置。 2. **插入Application Component**:在命名空间中插入一个新的Application ...

    structs in action中文完全版\9. 扩展 ActionServlet.pdf

    - **单例模式**:ActionServlet 通常在应用程序中以单例的形式存在,意味着整个应用期间只会有一个 ActionServlet 实例。 #### 二、Struts 1.0 与 1.1 版本之间的 ActionServlet 变化 在 Struts 1.0 到 1.1 的版本...

    php面向过程留言板实例

    2. **处理留言**:创建一个PHP文件(如`process_message.php`),该文件将接收表单数据,进行基本的验证(如非空检查和防止SQL注入),然后将数据保存到文件或数组。你可以创建一个名为`messages.txt`的文本文件,...

    Markov Decision Process (MDP) Algorithm.zip,这是一份不错的文件

    **Markov决策过程(Markov Decision Process, MDP)**是一种广泛应用在决策理论和人工智能领域的数学模型,主要用于描述一个系统随时间演变的过程,其中系统的状态转移只依赖于当前状态,而与过去的历史状态无关,这种...

    Process Management in Linux

    进程0通常被称为“交换进程”(swapper),它是系统启动后创建的第一个进程,主要用于处理与内核线程相关的任务。 ##### 2.2 进程1 (init) 进程1是名为`init`的关键进程,它负责初始化用户空间的进程树。 - **...

    jbpm_Single_cycle.rar_Action!

    在执行过程中,它会维护一个工作项(Task)列表,每个工作项代表当前需要处理的任务。当一个任务完成后,jbpm会检查后续的流转规则,如果满足单点循环的条件,那么就会重新激活该任务,使其再次进入待办事项列表。 ...

    马尔可夫决策过程是强化学习中的一个核心概念.docx

    马尔可夫决策过程(Markov Decision Process,简称MDP)是强化学习中的一个核心概念,它是一种数学模型,用于描述决策者在不确定环境中进行决策的过程。MDP具有广泛的应用领域,包括资源分配、生产调度、金融投资、...

    jbpm-console-ng-process-modeling-client-6.0.0.Beta1.zip

    【jbpm-console-ng-process-modeling-client-6.0.0.Beta1.zip】是一个与业务流程管理(BPM)相关的开源项目,主要关注的是过程建模的用户界面客户端。jbpm是JBoss企业级中间件的一部分,由Red Hat公司维护,提供了...

Global site tag (gtag.js) - Google Analytics