实例对象和各个实例方法
实例对象
在 Rails 源代码里,app.routes 指的是 RouteSet 的实例对象。
# action_mailer/railtie.rb
extend ::AbstractController::Railties::RoutesHelpers.with(app.routes, false)
include app.routes.mounted_helpers
# action_controller/railtie.rb
include app.routes.mounted_helpers
extend ::AbstractController::Railties::RoutesHelpers.with(app.routes)
# action_dispatch/routing/mapper.rb
app.routes.define_mounted_helper(name)
app.routes.extend Module.new { ... }
# rails/application/finisher.rb
app.routes.append do ... end
app.routes.define_mounted_helper(:main_app)在 Rails 源代码里,@set 有时候也是 RouteSet 的实例对象,如 Mapper 里:
# action_dispatch/routing/mapper.rb
initialize
@set = set
@scope = Scope.new({ :path_names => @set.resources_path_names })
dispatcher
@set.dispatcher defaults
default_url_options=
@set.default_url_options = options
has_named_route?
@set.named_routes.routes[name.to_sym]
define_generate_prefix
_route = @set.named_routes.get name
_routes = @set
add_route
mapping = Mapping.build(@scope, @set, URI.parser.escape(path), as, options)
@set.add_route(app, conditions, requirements, defaults, as, anchor)
name_for_action
candidate unless candidate !~ /\A[_a-z]/i || @set.named_routes.key?(candidate)也正因为如此,除了 draw 和 add_routes 外,我们可以在代码里搜索,看哪里的代码影响了路由规则的生成。
各个实例方法
recognize_path 使用举例:
通过这一步,外部 URL 已经被转换成了 Rails 能够识别的语言。在这之后,Rails 想怎么处理就怎么处理。
draw 直接对外暴露的接口,初始化 Mapper 对象。然后交还各个模块处理。 本质是:运用 Mapper,处理 config/routes.rb 里的代码。
相关代码:
之后,就是执行【路由常用方法汇总】章节里提到的方法。
initialize用到了 NamedRouteCollection, 内容是:
初始化了几个有意义的变量,如:named_routes、@set、@router、@formatter
generate 用到了 Generator,内容是:
dispatcher 用到了 Dispatcher 内容是:
最后更新于
这有帮助吗?