命名路由 _path 与 _url

Posted

技术标签:

【中文标题】命名路由 _path 与 _url【英文标题】:Named routes _path vs _url 【发布时间】:2012-08-10 00:15:19 【问题描述】:

Rails 提供named routes。

可以使用路径或 url 调用路由助手

例如来自文档:

# and provide these named routes
root_url   # => 'http://www.example.com/'
root_path  # => '/'

坦率地说,我还没有使用过 *_url 助手,我可以使用 *_path 来完成工作。

我有点困惑这两个不同的助手的目的是什么?

它们有什么不同?

一些真实的例子,说明何时使用什么会很棒。

【问题讨论】:

【参考方案1】:

_path 助手提供了一个站点根相对路径。您应该大部分时间都应该使用它。

_url 助手提供一个绝对路径,包括协议和服务器名称。我发现在服务器上创建指向应用程序的链接时,我主要在电子邮件中使用这些。它们应该主要在提供外部使用的链接时使用。 (想想电子邮件链接、RSS 以及 YouTube 视频的“分享”部分下的复制和粘贴 URL 字段等内容。)

【讨论】:

两个答案几乎相似,但我在此示例“在 YouTube 视频的“分享”部分下复制并粘贴 URL 字段”并且已经为@mori +1 提供了正确答案:) 谢谢。我正在构建一个 DAM 解决方案,其中有一个类似于 YouTube 所做的复制/粘贴“共享 URL”字段。这是我首先想到的事情之一。【参考方案2】:

当您在自己的站点中放置链接时,路由的域部分是多余的,并且会增加页面大小,因此您可以将 URL 的路径部分与 *_path 帮助器一起使用。另一方面,如果要在您的站点之外使用 URL,例如电子邮件或 RSS 提要,需要完整的 URL,因此请使用 *_url 助手。

【讨论】:

我最近遇到了链接和域的问题,而 _url 帮助器是我使用正确域而不是“托管相关”链接获取链接的唯一方法。 当应用中有一些子域时,我也会使用 _url 助手。例如,当 im 在 abc.example.com 上时,_path 将重定向到 abc.example.com/somesection,而 _url 将正确重定向到 example.com/somesection【参考方案3】:

正如其他答案所解释的,您应该在电子邮件链接等中使用_url。 但我想补充一点,您还应该在重定向中使用_url,如下所述:

https://www.ruby-forum.com/topic/101346#221052

这里:

http://viget.com/extend/rails-named-routes-path-vs-url

您还可以在此处查看 HTTP 规范的相关部分:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30

【讨论】:

引用第一个链接(以防它消失):“但是,在控制器中,redirect_to 需要 *_url,因为 HTTP 规范要求 Location: 3xx 重定向中的标头是完整的 URL。 "【参考方案4】:

_path 提供相对路径。

_url 提供绝对路径。

每当您通过电子邮件等方式发送 URL 时,最好使用 _url 而不是 _path。

【讨论】:

投反对票,因为这正是克里斯彼得斯在此答案之前两年多已经回答的问题。多余的答案没有帮助。 赞成,因为它在视觉上不那么嘈杂,您无需解析诸如“您应该”或“我发现”或“它们主要应该被使用”之类的意见短语即可获得答案

以上是关于命名路由 _path 与 _url的主要内容,如果未能解决你的问题,请参考以下文章

django的路由层

flask之路由

Django定义路由_子路由_函数视图

Django定义路由_子路由_函数视图

Django定义路由_子路由_函数视图

Django 基础 之路由层