当我们在 routes.rb
中使用 map.some_link
之类的名称定义路由时。我们可以通过两种方式使用链接 - some_link_url
、some_link_path
。
两者有什么区别?
使用哪个更安全?
我有同样的问题,我写了 a small post about this in my blog
原因总结在这里(我在论坛上找到的):
*_path 用于视图,因为 ahref 隐式链接到当前 URL。所以一遍又一遍地重复它会浪费字节。但是,在控制器中,redirect_to 需要 *_url,因为 HTTP 规范要求 3xx 重定向中的 Location: 标头是完整的 URL。
Here is another explanation 这表示这取决于我们在从非 SSL 站点链接到 SSL 站点时是否需要使用绝对 URI,反之亦然。
到目前为止,我所阅读的内容并不表明它们中的任何一个都比另一个更安全。这真的归结为“正确”的用法。
path
是相对的,而 url
是绝对的。
名为“用户”的资源的差异示例:
users_url # => http://localhost:3000/users
users_path # => /users
如果您的意思是不公开所有传递的数据,则通过安全,那么 _path 会更好,因为它会生成一个相对 url,类似于 '/login' 但 _path 会给出 'http://localhost:3000/login'。请参阅我在某个时候发现的有关相同内容的这篇博客文章。 When _url is better than _path
_url 将给出整个路径。由于它包含域名和协议,因此您可以将其用于例如。发送电子邮件或重定向到另一个域等。
_path 将返回 '/' 之后没有域、协议等的路径。所以你可以不时使用它(我猜),你不需要域的详细信息。
_url
帮助程序生成一个包含整个 URL 的字符串,而 _path
帮助程序生成一个包含从应用程序根开始的相对路径的字符串,例如:
photos_url # => "http://www.example.com/photos"
photos_path # => "/photos"
_url
。_path
输出同样适用于重定向中的Location
标头。浏览器会将其解释为相对于根的重定向。_path
在控制器中工作。