Action Dispatch Routing
UrlFor
在 config/routes.rb
中,你定义了 URL 到控制器映射,但反过来也是可能的:你可以从你的路由定义中生成一个 URL。URL 生成功能集中在这个模块中。
有关路由和 config/routes.rb
的一般信息,请参阅 ActionDispatch::Routing
。
提示:如果你需要从你的模型或其他地方生成 URL,那么 ActionDispatch::Routing::UrlFor
是你需要的。继续阅读以获取介绍。通常,此模块不应该单独包含,因为它通常由 url_helpers
包含(例如 Rails.application.routes.url_helpers
)。
从参数生成 URL
如你所知,一些函数,例如 ActionController::Base#url_for
和 ActionView::Helpers::UrlHelper#link_to
,可以根据一组参数生成 URL。例如,你可能在你的某个视图中编写过类似这样的代码
<%= link_to('Click here', controller: 'users',
action: 'new', message: 'Welcome!') %>
# => <a href="/users/new?message=Welcome%21">Click here</a>
link_to
和所有其他需要 URL 生成功能的函数实际上都在幕后使用了 ActionDispatch::Routing::UrlFor
。特别地,它们使用了 ActionDispatch::Routing::UrlFor#url_for
方法。可以使用以下代码生成与上述示例相同的路径
include ActionDispatch::Routing::UrlFor
url_for(controller: 'users',
action: 'new',
message: 'Welcome!',
only_path: true)
# => "/users/new?message=Welcome%21"
请注意 only_path: true
部分。这是因为 UrlFor
没有任何关于你的 Rails
应用程序正在提供的网站主机的信息。因此,如果你还想包含主机名,则必须传递 :host
参数
include UrlFor
url_for(controller: 'users',
action: 'new',
message: 'Welcome!',
host: 'www.example.com')
# => "http://www.example.com/users/new?message=Welcome%21"
默认情况下,所有控制器和视图都可以访问 url_for
的一个特殊版本,它已经知道当前主机名是什么。因此,如果你在你的控制器或视图中使用 url_for
,则不需要显式传递 :host
参数。
为了方便起见,邮件程序也包含 ActionDispatch::Routing::UrlFor
。因此,在邮件程序中,你可以使用 url_for。但是,邮件程序无法访问传入的 Web 请求以获取主机信息,因此你必须提供 :host
选项或使用 default_url_options
设置默认主机。有关邮件程序中 url_for
的更多信息,请参阅 ActionMailer::Base
文档。
命名路由的 URL 生成
UrlFor
还允许你访问从命名路由自动生成的函数。例如,假设你的 config/routes.rb
中有一个“users”资源
resources :users
这将生成 users_path
方法(以及其他方法)。默认情况下,此方法可以从你的控制器、视图和邮件程序访问。如果你需要从其他地方(例如模型)访问此自动生成的函数,则可以在你的类中包含 Rails.application.routes.url_helpers
class User < ActiveRecord::Base
include Rails.application.routes.url_helpers
def base_uri
user_path(self)
end
end
User.find(1).base_uri # => "/users/1"
- #
- N
- O
- R
- U
类公共函数
new(...) 链接
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 111 def initialize(...) @_routes = nil super end
实例公共函数
route_for(name, *args) 链接
允许调用直接或常规命名路由。
resources :buckets
direct :recordable do |recording|
route_for(:bucket, recording.bucket)
end
direct :threadable do |threadable|
route_for(:recordable, threadable.parent)
end
这会保持原始调用者关于返回路径还是完整 URL 的上下文,例如
threadable_path(threadable) # => "/buckets/1"
threadable_url(threadable) # => "http://example.com/buckets/1"
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 222 def route_for(name, *args) public_send(:"#{name}_url", *args) end
url_for(options = nil) 链接
根据提供的选项、default_url_options
和 config/routes.rb
中定义的路由生成 URL。支持以下选项
-
:only_path
- 如果为真,则返回相对 URL。默认值为false
。 -
:protocol
- 要连接的协议。默认值为"http"
。 -
:host
- 指定链接应指向的主机。如果:only_path
为假,则必须通过显式提供或通过default_url_options
提供此选项。 -
:subdomain
- 使用tld_length
指定链接的子域名,以从主机中分离子域名。如果为假,则从链接的主机部分中删除所有子域名。 -
:domain
- 使用tld_length
指定链接的域名,以从主机中分离域名。 -
:tld_length
- TLD ID 组成部分的标签数量,仅在提供:subdomain
或:domain
时使用。默认值为ActionDispatch::Http::URL.tld_length
,它又默认为 1。 -
:port
- 可选地指定要连接的端口。 -
:anchor
- 要附加到路径的锚点名称。 -
:params
- 要附加到路径的查询参数。 -
:path_params
- 仅用于路径的命名动态段的查询参数。如果未使用,则将被丢弃。 -
:trailing_slash
- 如果为真,则添加尾部斜杠,例如"/archive/2009/"
。 -
:script_name
- 指定相对于域根目录的应用程序路径。如果提供,则在前面加上应用程序路径。
传递给 url_for
的任何其他键(:controller
、:action
等)都将转发到 Routes 模块。
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', port: '8080'
# => 'http://somehost.org:8080/tasks/testing'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', anchor: 'ok', only_path: true
# => '/tasks/testing#ok'
url_for controller: 'tasks', action: 'testing', trailing_slash: true
# => 'http://somehost.org/tasks/testing/'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', number: '33'
# => 'http://somehost.org/tasks/testing?number=33'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp"
# => 'http://somehost.org/myapp/tasks/testing'
url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp", only_path: true
# => '/myapp/tasks/testing'
缺少的路由键可以从当前请求的参数中填充(例如 :controller
、:action
、:id
以及放置在路径中的任何其他参数)。鉴于当前操作是通过 GET /users/1
达成的
url_for(only_path: true) # => '/users/1'
url_for(only_path: true, action: 'edit') # => '/users/1/edit'
url_for(only_path: true, action: 'edit', id: 2) # => '/users/2/edit'
请注意,第一个 url_for
调用没有提供 :id
参数,并且帮助器使用了来自路由路径的 :id
参数。任何由 url_for
隐式使用的路径参数都可以随时像最后几个 url_for
调用中显示的那样被覆盖。
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 178 def url_for(options = nil) full_url_for(options) end
url_options() 链接
在控制器中覆盖的钩子,用于使用 default_url_options
添加请求信息。应用程序逻辑不应该进入 url_options。
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 118 def url_options default_url_options end
实例保护函数
optimize_routes_generation?() 链接
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 227 def optimize_routes_generation? _routes.optimize_routes_generation? && default_url_options.empty? end
实例私有函数
_routes_context() 链接
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 239 def _routes_context # :doc: self end
_with_routes(routes) 链接
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/routing/url_for.rb, line 232 def _with_routes(routes) # :doc: old_routes, @_routes = @_routes, routes yield ensure @_routes = old_routes end