实例公共方法
has_named_route?(name) Link
查询是否已定义以下命名路由。
match(path, options = nil) Link
将 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
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来禁用它。
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) Link
挂载一个基于 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 辅助方法,可用于导航到此挂载的应用程序。
# 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