跳至内容 跳至搜索
方法
D
H
M
W

实例公共方法

default_url_options(options)

default_url_options=(options)

也别名为: default_url_options
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 640
def default_url_options=(options)
  @set.default_url_options = options
end

has_named_route?(name)

查询以下命名路由是否已定义。

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 652
def has_named_route?(name)
  @set.named_routes.key?(name)
end

match(path, options = nil)

将 URL 模式匹配到一个或多个路由。

你不应该在你的路由器中使用 match 方法而没有指定 HTTP 方法。

如果你想将你的操作同时暴露给 GET 和 POST,使用

# sets :controller, :action, and :id in params
match ':controller/:action/:id', via: [:get, :post]

注意 :controller:action:id 被解释为 URL 查询参数,因此可以通过操作中的 params 获取。

如果你想将你的操作暴露给 GET,在路由器中使用 get

而不是

match ":controller/:action/:id"

get ":controller/:action/:id"

这两个符号是特殊的,:controller 映射到控制器,:action 映射到控制器的操作。一个模式也可以将通配符段(全局变量)映射到参数

get 'songs/*category/:title', to: 'songs#show'

# 'songs/rock/classic/stairway-to-heaven' sets
#  params[:category] = 'rock/classic'
#  params[:title] = 'stairway-to-heaven'

要匹配通配符参数,它必须分配一个名称。如果没有变量名称来附加全局变量参数,则无法解析路由。

当一个模式指向一个内部路由时,路由的 :action:controller 应该在选项或哈希简写中设置。例子

match 'photos/:id', to: 'photos#show', via: :get
match 'photos/:id', controller: 'photos', action: 'show', via: :get

一个模式也可以指向一个 Rack 端点,即任何响应 call 的东西

match 'photos/:id', to: -> (hash) { [200, {}, ["Coming soon"]] }, via: :get
match 'photos/:id', to: PhotoRackApp, via: :get
# Yes, controller actions are just rack endpoints
match 'photos/:id', to: PhotosController.action(:show), via: :get

由于使用单个操作请求各种 HTTP 动词存在安全隐患,因此您必须在 via 选项中指定操作,或者使用 HttpHelpers 而不是 match

选项

这里没有看到的所有选项都作为参数与 URL 一起传递。

:controller

路由的控制器。

:action

路由的操作。

:param

覆盖默认资源标识符 :id(用于生成路由的动态段的名称)。你可以使用 params[<:param>] 从你的控制器访问该段。在你的路由器中

    resources :users, param: :name

The `users` resource here will have the following routes generated for it:

    GET       /users(.:format)
    POST      /users(.:format)
    GET       /users/new(.:format)
    GET       /users/:name/edit(.:format)
    GET       /users/:name(.:format)
    PATCH/PUT /users/:name(.:format)
    DELETE    /users/:name(.:format)

You can override `ActiveRecord::Base#to_param` of a related model to
construct a URL:

    class User < ActiveRecord::Base
      def to_param
        name
      end
    end

    user = User.find_by(name: 'Phusion')
    user_path(user)  # => "/users/Phusion"
:path

路由的前缀路径。

:module

:controller 的命名空间。

    match 'path', to: 'c#a', module: 'sekret', controller: 'posts', via: :get
    # => Sekret::PostsController

See `Scoping#namespace` for its scope equivalent.
:as

用于生成路由帮助器的名称。

:via

路由允许的 HTTP 动词。

    match 'path', to: 'c#a', via: :get
    match 'path', to: 'c#a', via: [:get, :post]
    match 'path', to: 'c#a', via: :all
:to

指向一个 Rack 端点。可以是响应 call 的对象,也可以是表示控制器操作的字符串。

    match 'path', to: 'controller#action', via: :get
    match 'path', to: -> (env) { [200, {}, ["Success!"]] }, via: :get
    match 'path', to: RackApp, via: :get
:on

将路由包装在特定 RESTful 上下文中的简写。有效值为 :member:collection:new。仅在 resource(s) 块中使用。例如

    resource :bar do
      match 'foo', to: 'c#a', on: :member, via: [:get, :post]
    end

Is equivalent to:

    resource :bar do
      member do
        match 'foo', to: 'c#a', via: [:get, :post]
      end
    end
:constraints

使用正则表达式哈希或响应 matches? 的对象来约束参数。此外,除了路径之外的约束也可以使用任何响应 === 的对象来指定(例如 StringArrayRange 等)。

    match 'path/:id', constraints: { id: /[A-Z]\d{5}/ }, via: :get

    match 'json_only', constraints: { format: 'json' }, via: :get

    class PermitList
      def matches?(request) request.remote_ip == '1.2.3.4' end
    end
    match 'path', to: 'c#a', constraints: PermitList.new, via: :get

See `Scoping#constraints` for more examples with its scope equivalent.
:defaults

为参数设置默认值

    # Sets params[:format] to 'jpg' by default
    match 'path', to: 'c#a', defaults: { format: 'jpg' }, via: :get

See `Scoping#defaults` for its scope equivalent.
:anchor

布尔值,用于锚定 match 模式。默认值为 true。当设置为 false 时,模式匹配以给定路径为前缀的任何请求。

    # Matches any request starting with 'path'
    match 'path', to: 'c#a', anchor: false, via: :get
:format

允许您为可选 format 段指定默认值,或者通过提供 false 来禁用它。

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 592
def match(path, options = nil)
end

mount(app, options = nil)

挂载基于 Rack 的应用程序,以便在应用程序中使用。

mount SomeRackApp, at: "some_route"

有关选项,请参见 match,因为 mount 在内部使用它。

所有挂载的应用程序都附带路由帮助器以访问它们。这些以指定的类命名,因此对于上面的示例,帮助器是 some_rack_app_pathsome_rack_app_url。要自定义此帮助器的名称,请使用 :as 选项

mount(SomeRackApp, at: "some_route", as: "exciting")

这将生成 exciting_pathexciting_url 帮助器,可用于导航到此挂载的应用程序。

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 610
        def mount(app, options = nil)
          if options
            path = options.delete(:at)
          elsif Hash === app
            options = app
            app, path = options.find { |k, _| k.respond_to?(:call) }
            options.delete(app) if app
          end

          raise ArgumentError, "A rack application must be specified" unless app.respond_to?(:call)
          raise ArgumentError, <<~MSG unless path
            Must be called with mount point

              mount SomeRackApp, at: "some_route"
              or
              mount(SomeRackApp => "some_route")
          MSG

          rails_app = rails_app? app
          options[:as] ||= app_name(app, rails_app)

          target_as       = name_for_action(options[:as], path)
          options[:via] ||= :all

          match(path, { to: app, anchor: false, format: false }.merge(options))

          define_generate_prefix(app, target_as) if rails_app
          self
        end

with_default_scope(scope, &block)

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 645
def with_default_scope(scope, &block)
  scope(scope) do
    instance_exec(&block)
  end
end