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

实例公共方法

default_url_options(options)

default_url_options=(options)

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 629
def default_url_options=(options)
  @set.default_url_options = options
end

has_named_route?(name)

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

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 641
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 映射到控制器的操作。模式还可以将通配符段 (glob) 映射到参数

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。示例

match 'photos/:id' => 'photos#show', via: :get
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 选项中指定操作或使用 match 以外的 HttpHelpers 之一

选项

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

:controller

路由的控制器。

:action

路由的操作。

:param

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

resources :users, param: :name

此处 users 资源将为其生成以下路由

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)

你可以覆盖相关模型的 ActiveRecord::Base#to_param 来构造 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

请参阅 Scoping#namespace 以了解其范围等效项。

: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

等同于

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

请参阅 Scoping#constraints 以了解其范围等效项的更多示例。

:defaults

设置参数的默认值

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

请参阅 Scoping#defaults 以了解其范围等效项。

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

mount(app, options = nil)

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

mount SomeRackApp, at: "some_route"

或者

mount(SomeRackApp => "some_route")

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

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

mount(SomeRackApp => "some_route", as: "exciting")

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

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 599
        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 634
def with_default_scope(scope, &block)
  scope(scope) do
    instance_exec(&block)
  end
end