实例公共方法
default_url_options=(options) 链接
has_named_route?(name) 链接
查询是否已定义以下命名路由。
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
来构造 URLclass 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?
做出响应的对象来约束参数。此外,还可以使用对===
做出响应的任何对象(例如String
、Array
、Range
等)来指定除路径以外的约束。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
来禁用它。
来源:显示 | 在 GitHub 上
# 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_path
和 exciting_url
助手,可用于导航到此挂载的应用程序。
来源:显示 | 在 GitHub 上
# 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) 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 634 def with_default_scope(scope, &block) scope(scope) do instance_exec(&block) end end