使用rails中的路由时_url和_path有什么区别


68

当我们routes.rb使用诸如这样的名称定义路线时,map.some_link我们可以通过两种方式使用链接:some_link_urlsome_link_path

  • 两者之间有什么区别?
  • 使用哪个更安全?

Answers:


86

我有相同的问题,并且在我的博客中了一篇有关此问题的小文章

原因总结如下(我在论坛上找到了):

* _path用于视图,因为ahref隐式链接到当前URL。因此,一遍又一遍地重复它会浪费字节。但是,在控制器中,* _url对于redirect_to是必需的,因为HTTP规范要求3xx重定向中的Location:标头是完整的URL。

这是另一个说明,它取决于从非SSL站点链接到SSL站点时是否需要使用绝对URI,反之亦然。

到目前为止,我所读的内容并不意味着它们中的任何一个都比另一个更安全。真正归结为什么是“正确”用法。


3
非常感谢。发现它很有用。因此,在控制器中,我们使用“ _url”,而在视图中,我们可以使用“ _path”,尽管在那里也可以使用“ _url”。
MohamedSanaulla

14
您不需要为控制器使用* _url,路径也可以正常工作。仅应_url在显示到外部资源的路线时使用。
Ryan Bigg

3
要澄清更多: _path输出将对Location重定向中的标头同样有效。浏览器会将其解释为相对于根的重定向。
Ryan Bigg

2
答案中的引号不正确。 _path在控制器中工作。
埃米尔(Emil)

2
您博客文章的URL为404'ing。您可以更新链接吗?
jshah

81

path是相对而url绝对。


2
相当简洁。我喜欢简洁。;)+1
sholsinger 2011年

2
完善。在控制器(服务器端)中需要使用_url,并且在视图(浏览器端)中必须使用_path。
阿伦(Arun)

简明扼要的答案+1
Mike W

38

资源称为“用户”的差异的一个示例:

users_url # => http://localhost:3000/users
users_path  # => /users


1

可以肯定地说,如果您不公开所有传递的数据,那么_path会更好,因为它会生成一个相对的url,类似于“ / login”,但_path会给出“ http:// localhost:3000 / login ”。请参考我有时发现的与此相同的博客文章。当_url比_path更好时


3
恐怕这是不正确的。出于安全原因使用_path不能提供任何安全性。这与说当简单的DNS请求揭示此信息时,应将Web服务器的IP地址保持秘密相同。
jefflunt

1
同样,对于上面提供的有关隐藏主机和端口“ localhost:3000”以确保安全的示例,这是不正确的。使用广泛使用的软件网络扫描工具可以轻松发现这些信息。
jefflunt 2010年

1

_url将给出整个路径。由于它包含域名和协议,因此可以将其用于例如。发送电子邮件或重定向到其他域等

_path将返回在'/'之后的无域,协议等的路径。因此,您可以不时使用它(我想),这里您不需要域的详细信息。


-1

_url辅助生成包含整个URL的字符串,而_path辅助生成包含从应用程序,例如,根目录的相对路径的字符串:

photos_url  # => "http://www.example.com/photos"
photos_path # => "/photos"

根据Rails指南-路由

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.