Rails源码阅读(七)ActionController::Routing::Routes_用户请求在rails中的处理流程(2)
ActionController::Dispatcher把主要工作交给了ActionController::Routing::Routes.call(@env)
ActionController::Routing::Routes的代码:
Routes = RouteSet.new
原来这个常量不是个module,也不是class,是个实例
这样call方法就是RouteSet.new的call方法了
RouteSet的call代码:
def call(env)
request = Request.new(env) #a new一个request真简单!
app = Routing::Routes.recognize(request) #b 识别Controller 下面详细说
app.call(env).to_a #调用call,返回的结果to_a,一定是rack的标准输出了
end
Routing::Routes.recognize(request)做了什么:
def recognize(request)
params = recognize_path(request.path, extract_request_environment(request))
request.path_parameters = params.with_indifferent_access #原来这个东西在这里做的!实际使用发现,一不小心,很难调试的bug就会从这里出来阿!!!
"#{params[:controller].to_s.camelize}Controller".constantize
end
查看返回结果,函数返回了要访问的Controller。
至此,终于接触到达了我们写的代码:XXXController处。
这样app就是某个我们自己写的Controller了,注意这是个类,不是个实例!
从app.call(env).to_a来看,每个Controller都有个call(env)方法,所以应该在父类里。看看继承结构:
XXXController < ApplicationController < ActionController::Base
果然是从super-class来的,否则自己写多麻烦:
ActionController::Base.call方法(注意这里是类方法!):
class << self
def call(env)
# HACK: For global rescue to have access to the original request and response
request = env["action_controller.rescue.request"] ||= Request.new(env)
response = env["action_controller.rescue.response"] ||= Response.new
process(request, response) #这里!
end
# ActionController::Base.process代码:
# Factory for the standard create, process loop where the controller is discarded after processing.
def process(request, response) #:nodoc:
new.process(request, response)
end
end
总结:
#1 RouteSet的call方法,根据访问链接和路由配置,识别出了应该去找哪个XXXController,同时找哪个action也得到了,放入params:
Parameters: {"method"=>:get, "action"=>"follow", "controller"=>"profile"}
#2 执行XXXController.run方法
到这里,执行流程到了:ActionController::Base,即:ActionController::Base.process方法。
====结束====
=== ===
== ==
= =
| |
分享到:
相关推荐
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
For-Rails-Beginners::Japanese_symbol_for_beginner:Ruby on Rails的初学者有福了
延迟加载整个血腥路由,因此应用程序可以快速启动:sign_of_the_horns:route_lazy_routes route_lazy_routes是一个邪恶的Rails插件,它延迟加载整个血腥路由,直到服务器获得第一个请求,因此应用程序可以旋转快起来...
对Rails的扩展,以允许使用绕道而行,返回简单的工作流浏览器导航。 特征 将您的“ link_to”行切换为“ detour_to”,并将您的控制器“ redirect_to”切换为“ back_or_redirect_to”,以允许用户从其来访者返回。 ...
在您的config/initializers/rails_admin.rb初始化程序中添加配置: RailsAdmin . config do | config | config . model Post do list do sort_by :position # Add Default sorting sort_reverse false # sort p
持续移动且不破坏事物 :factory: :building_construction: :construction: :construction_worker: 正在建设中-请稍后再回来!
主存储库已移至gitlab,所有新代码将在其中: 它的外观和感觉完全类似于但是使用了jQuery Nested Sortable和或而不是Nestable和Ancestry 。 与和awesome_nested_set一起使用。 奖励功能: 对带有rails_admin_...
允许您使用为Rails应用程序的前端供电。 是将前端工具像Ruby一样进行编程,纯属喜悦! :smiling_face_with_heart-eyes: 或在运行的检查。 产品特点 :high_voltage: :light_bulb: 即时服务器启动 :high_voltage: ...
在Rails应用程序的根目录中,运行: rails_best_practices . 或用于HTML输出: rails_best_practices -f html . 默认情况下,rails_best_practices将解析vendor , spec , test和features目录中的代码。 排除目录...
其余都是可选的) 更简单的提示修改(类似于你已经熟悉的默认提示) 无需担心配置(因为反正没有太多选择)安装宝石档案: gem 'awesome_rails_console' 在终端: bundlerails g awesome_rails_console:install # ...
它建立在Ruby的EventMachine库之上,主要用于处理一些大量的开放连接 (如Comet系统或streaming APIs),整个过程都使用event-driven I/O。 Cramp使用Rails 3.0的ActiveSupport 和 ActiveModel库, 它会显示两层用于...
Rails管理员状态机 主存储库已移至gitlab,所有新代码将在其中: 从rails_admin正确管理状态 允许从Rails Admin轻松地将state_machine事件发送到模型,包括对ActiveRecord \ Mongoid和自定义状态字段名称的支持以及...
rails_autolink 描述: 这是从rails中提取的auto_link方法。 `auto_link`方法已从Rails 3.1版本的Rails中删除。 该宝石旨在弥合移民人群的鸿沟。 特点: 默认情况下,auto_link返回已清理的html_safe字符串。...
routes_lazy_routes routes_lazy_routes是一个邪恶的Rails插件,它将延迟加载整个流血的路由,直到服务器收到第一个请求为止,因此该应用程序可以快速启动。 :sign_of_the_horns: 这款巫毒宝石是专为维护大型遗留...
ActionController :: Base token_authentication_for :user_account end 辅助方法 检查用户是否已登录并获取当前已登录用户,可以使用以下类似 Devise 的帮助程序: user_account_signed_in? current_user_...
接受请求时,Log Rails应用程序的操作和过滤器。 安装 将此行添加到您的应用程序的Gemfile中: gem 'action_tracer' , group :development , :test 注意,该宝石适用于Rails,其中ApplicationController继承了...
:dog_face: MiAudota :cat_face: 该应用程序显示可从用户最近的庇护所获取的动物,并允许将其应用到收养过程中,从而完成一份调查表,庇护所将评估可能采用者的概况。 宠物预览这个怎么运作? :thinking_face: 用户...
Rails Admin枚举4 Rails Admin插件,用于正确查看Rails 4.1枚举 安装 gem 'rails_admin_enum4', github: 'sibext/rails_admin_enum4' bundle install 用法 通过生成器生成新模型: rails g model Sibext service:...
最早是因为在使用Google安卓架构组件的时候,存在一些涉及网络请求的demo,自己不上手写,总感觉不踏实。又不想重新去搞java ee,一回想,去年的rails还有点印象,要不这下自己来试试。买好书,一点一点来看。 书是...
语言引擎 language_engine 是一个用于语言的 rails 引擎: 控制器帮手视图和资产没有定义,因为我们认为每个人都想在他们的页面中调整视图。 您可以使用访问演示登录: 密码:chouette要求此代码已在 Travis 上运行...