实例对象和各个实例方法

实例对象

在 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)

也正因为如此,除了 drawadd_routes 外,我们可以在代码里搜索,看哪里的代码影响了路由规则的生成。

各个实例方法

recognize_path 使用举例:

通过这一步,外部 URL 已经被转换成了 Rails 能够识别的语言。在这之后,Rails 想怎么处理就怎么处理。

draw 直接对外暴露的接口,初始化 Mapper 对象。然后交还各个模块处理。 本质是:运用 Mapper,处理 config/routes.rb 里的代码。

相关代码:

之后,就是执行【路由常用方法汇总】章节里提到的方法。

initialize用到了 NamedRouteCollection, 内容是:

初始化了几个有意义的变量,如:named_routes、@set、@router、@formatter

generate 用到了 Generator,内容是:

dispatcher 用到了 Dispatcher 内容是:

最后更新于

这有帮助吗?