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

实例公共方法

default_url_options(options)

default_url_options=(options)

Also aliased as: default_url_options
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 650
def default_url_options=(options)
  @set.default_url_options = options
end

has_named_route?(name)

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

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

match(path, options = nil)

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

你不应在路由中使用 match 方法而不指定 HTTP 方法。

如果你想同时暴露你的 action 为 GET 和 POST,请使用

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

请注意,:controller:action:id 被解释为 URL 查询参数,因此可以通过 params 在 action 中访问。

如果你想暴露你的 action 为 GET,请在路由中使用 get

代替

match ":controller/:action/:id"

请这样做

get ":controller/:action/:id"

其中两个符号是特殊的::controller 映射到控制器,:action 映射到控制器的 action。模式还可以将通配符段(globs)映射到 params。

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

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

要匹配通配符参数,它必须被指定一个名称。如果没有要附加 glob 参数的变量名,则无法解析该路由。

当模式指向内部路由时,该路由的 :action:controller 应该在 options 或 hash 简写中设置。例如:

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

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

Options

此处未显示的任何选项都将作为 params 随 URL 一起传递。

:controller

路由的控制器。

:action

路由的 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 的对象,也可以是一个表示控制器 action 的字符串。

    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 587
def match(path, options = nil)
end

mount(app = nil, deprecated_options = nil, as: DEFAULT, via: nil, at: nil, defaults: nil, constraints: nil, anchor: false, format: false, path: nil, internal: nil, **mapping, &block)

挂载一个基于 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 605
        def mount(app = nil, deprecated_options = nil, as: DEFAULT, via: nil, at: nil, defaults: nil, constraints: nil, anchor: false, format: false, path: nil, internal: nil, **mapping, &block)
          if deprecated_options.is_a?(Hash)
            as = assign_deprecated_option(deprecated_options, :as, :mount) if deprecated_options.key?(:as)
            via ||= assign_deprecated_option(deprecated_options, :via, :mount)
            at ||= assign_deprecated_option(deprecated_options, :at, :mount)
            defaults ||= assign_deprecated_option(deprecated_options, :defaults, :mount)
            constraints ||= assign_deprecated_option(deprecated_options, :constraints, :mount)
            anchor = assign_deprecated_option(deprecated_options, :anchor, :mount) if deprecated_options.key?(:anchor)
            format = assign_deprecated_option(deprecated_options, :format, :mount) if deprecated_options.key?(:format)
            path ||= assign_deprecated_option(deprecated_options, :path, :mount)
            internal ||= assign_deprecated_option(deprecated_options, :internal, :mount)
            assign_deprecated_options(deprecated_options, mapping, :mount)
          end

          path_or_action = at

          if app.nil?
            hash_app, hash_path = mapping.find { |key, _| key.respond_to?(:call) }
            mapping.delete(hash_app) if hash_app

            app ||= hash_app
            path_or_action ||= hash_path
          end

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

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

          rails_app = rails_app? app
          as = app_name(app, rails_app) if as == DEFAULT

          target_as = name_for_action(as, path_or_action)
          via ||= :all

          match(path_or_action, to: app, as:, via:, defaults:, constraints:, anchor:, format:, path:, internal:, **mapping, &block)

          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 655
def with_default_scope(scope, &block)
  scope(**scope) do
    instance_exec(&block)
  end
end