- 浏览: 244585 次
文章分类
最新评论
-
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 1516正好需要,zz过来,抄袭自:http://www.surui. ... -
用GetText来进行ROR的国际化和本地化
2007-11-22 15:17 1445IBM developerWorks上的一篇文章,直接贴地址, ... -
advanced act_as_solr
2007-10-31 19:40 1789原文出处:http://www.quarkruby.com/2 ... -
act_as_solr
2007-10-31 19:39 1987原文出处:http://www.quarkruby.com/2 ... -
Ambition
2007-10-31 19:36 1366原文出处:http://railsontherun.com/2 ... -
使用Inkscape提供自己的pdf服务
2007-10-31 19:34 1551原文出处:http://www.thesatya.com/bl ... -
给will_paginate加上ajax效果
2007-10-31 19:30 2157原文出处:http://railsontherun.com/2 ... -
使用rails制作图表
2007-10-31 19:21 2816原文出处:http://www.railsontherun.c ... -
如果定制attachment_fu上传文件的路径和文件名
2007-10-31 16:59 2749原文出处:http://the.railsi.st/2007/ ... -
attachment_fu使用指南
2007-10-31 16:56 3205原文出处:http://clarkware.com/cgi/b ... -
(ZZ)Cache in Rails
2007-09-25 15:49 1517很经典的文章,留在blog里面做个收藏 Ruby on Rai ... -
(ZZ)Ruby on Rails Security Guide
2007-09-24 21:28 2683Ruby on Rails Security Gui ... -
学到三招
2007-09-24 01:54 1397第一招:用ruby-debug来调试rails程序 具体使用方 ... -
在线查看rails代码和edge rails api的网址,备份,以免忘记
2007-09-14 18:38 1333Edge Rails API: http://caboo.se ... -
总是看到returning,这到底是个什么东东,查了一下找到了源代码
2007-09-14 18:37 1391A Ruby-ized realization of the ... -
一个简单的link_to,ROR到底在背后做了些什么?(未完)
2007-09-14 18:20 3464滥用link_to会造成ror程序 ... -
学到关于include的一点儿知识
2007-08-23 18:09 1167ruby 代码 module Test ... -
在一个controller中render另外一个controller中view的时候出现问题
2007-08-21 18:27 2155我想在posts这个controller中的show.rh ... -
因为Rjs试用NetBeans
2007-06-20 09:44 1130因为昨天看Rails Recipe的时候提到了rjs,于是四处 ...
相关推荐
马尔科夫决策过程马尔科夫决策过程(Markov Decision Process,简称MDP)是强化学习中的一个核心概念,也是序贯决策的数学模型,用于描述决策者在不确定环境中进行决策的过程。MDP具有广泛的应用领域,包括资源分配...
Process Phoenix是由知名Android开发者Jake Wharton推出的一个开源项目,旨在帮助开发者更加优雅地处理应用程序进程的重启。在Android系统中,应用进程可能会因为各种原因被系统杀死,例如内存不足、系统优化或者...
2. **一致性检查**:过程挖掘的一个关键应用是检查实际流程与预定义的流程规范之间的偏差。通过对事件日志和流程模型进行对比,可以发现流程中的不合规行为、异常路径或瓶颈,这有助于提高流程的合规性和效率。 3. ...
《过程挖掘:发现、一致性与业务流程增强》...对于希望利用过程挖掘技术优化业务流程的企业和个人来说,这本书是一个宝贵的资源。通过学习和应用过程挖掘技术,企业可以更有效地诊断问题,优化流程,提高整体运营效率。
行动导向的过程挖掘(Action-oriented Process Mining)致力于解决这一问题,它旨在建立一个桥梁,连接从事件数据中获取的知识与具体改善流程的实际行动。这一方法不仅关注洞察的生成,更强调这些洞察如何指导实时的...
《Process Mining Data Science in Action》这本书探讨的主题是图神经网络(GNN)在数据挖掘和机器学习中的应用。近年来,由于非欧几里得数据的增多,如对象间复杂关系和相互依赖的数据,传统的机器学习算法面临挑战...
Struts2是一个流行的Java web框架,它为开发者提供了一种结构化的方式来构建MVC(Model-View-Controller)应用程序。其请求处理流程是Struts2的核心机制,它决定了当一个HTTP请求到达时,如何被转化为应用程序的动作...
过程行动组(PAT)工作记录 process action team (PAT) working record 过程定义文件试验结果评定表 evaluation form for pilot result of process definition document 过程状态季度报告模板 process status ...
1. **命名空间的创建**:首先,在ESR的Software Component下创建一个命名空间,作为存放Process Integration Scenario的基础位置。 2. **插入Application Component**:在命名空间中插入一个新的Application ...
- **单例模式**:ActionServlet 通常在应用程序中以单例的形式存在,意味着整个应用期间只会有一个 ActionServlet 实例。 #### 二、Struts 1.0 与 1.1 版本之间的 ActionServlet 变化 在 Struts 1.0 到 1.1 的版本...
2. **处理留言**:创建一个PHP文件(如`process_message.php`),该文件将接收表单数据,进行基本的验证(如非空检查和防止SQL注入),然后将数据保存到文件或数组。你可以创建一个名为`messages.txt`的文本文件,...
**Markov决策过程(Markov Decision Process, MDP)**是一种广泛应用在决策理论和人工智能领域的数学模型,主要用于描述一个系统随时间演变的过程,其中系统的状态转移只依赖于当前状态,而与过去的历史状态无关,这种...
进程0通常被称为“交换进程”(swapper),它是系统启动后创建的第一个进程,主要用于处理与内核线程相关的任务。 ##### 2.2 进程1 (init) 进程1是名为`init`的关键进程,它负责初始化用户空间的进程树。 - **...
在执行过程中,它会维护一个工作项(Task)列表,每个工作项代表当前需要处理的任务。当一个任务完成后,jbpm会检查后续的流转规则,如果满足单点循环的条件,那么就会重新激活该任务,使其再次进入待办事项列表。 ...
马尔可夫决策过程(Markov Decision Process,简称MDP)是强化学习中的一个核心概念,它是一种数学模型,用于描述决策者在不确定环境中进行决策的过程。MDP具有广泛的应用领域,包括资源分配、生产调度、金融投资、...
【jbpm-console-ng-process-modeling-client-6.0.0.Beta1.zip】是一个与业务流程管理(BPM)相关的开源项目,主要关注的是过程建模的用户界面客户端。jbpm是JBoss企业级中间件的一部分,由Red Hat公司维护,提供了...