实例公共方法
default_url_options=(options) 链接
来源: 显示 | 在 GitHub 上
# 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) 链接
查询以下命名路由是否已定义。
来源: 显示 | 在 GitHub 上
# 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?
的对象来约束参数。此外,除了路径之外的约束也可以使用任何响应===
的对象来指定(例如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
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
来禁用它。
来源: 显示 | 在 GitHub 上
# 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_path
或 some_rack_app_url
。要自定义此帮助器的名称,请使用 :as
选项
mount(SomeRackApp, at: "some_route", as: "exciting")
这将生成 exciting_path
和 exciting_url
帮助器,可用于导航到此挂载的应用程序。
来源: 显示 | 在 GitHub 上
# 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) 链接
来源: 显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 645 def with_default_scope(scope, &block) scope(scope) do instance_exec(&block) end end