我对Rails 4如何使用_url和_path助手生成网址感到困惑。 我的配置是我有一个硬件设备处理https请求,它们路由到提供静态文件的nginx并将rails请求引用到瘦服务器。
在我的config / environments / production.rb中,我有
config.action_controller.default_url_options = {host: "mydomain", protocol: 'https'}
如果我使用`_path帮助程序在控制器中发出重定向,它会尝试重定向到nginx端口。 (外部无法访问) 如果我使用_url帮助程序在控制器中发出重定向,则会根据配置正确地重定向。
在视图中,link_to _path和_url生成正确的URL
所以我有两个问题 为什么帮助程序在视图和控制器中的工作方式不同。 有没有办法使用_path生成正确的url,或者我应该将所有内容更改为_url - 这是否有不足之处?
提前致谢
安迪
答案 0 :(得分:3)
简而言之:
_url
提供整个路径(域名和协议)。
_path
在'/'之后给出路径(没有域名或协议)。
您使用其中一种的原因有多种。
更长的形式,您可以阅读此页面:http://guides.rubyonrails.org/routing.html。那里有更多的信息可以帮助你,但它写得很好,我总结事情的尝试可能会让你了解重要的细节。
直接解决您的问题:
http://guides.rubyonrails.org/routing.html可能比我更好地回答(我不确切地知道你要做什么)。
您还可以阅读:
* _ path用于视图,因为ahrefs隐式链接到当前URL。所以一遍又一遍地重复它是浪费字节。但是,在控制器中,redirect_to需要* _url,因为HTTP规范要求3xx重定向中的Location:头是完整的URL。
。 。 。正如此处所述:https://stackoverflow.com/a/2350837/1026898
根据上面提供的信息判断您的判断。您是否尝试重定向到另一个域(我怀疑不是)?如果你是,你想在'_path'上使用'_url'。如果不是,您可能想要使用_path
。如果不知道你的具体情况,很难说。
从技术上来说,如果你以某种方式做到这一点,可能会有一些额外的开销,如果你以另一种方式做到这一点,你可以避免。然而,真正的问题是,只有当另一个开发人员进来并且必须在你身后做出改变时才会出现。如果您使用的是奇怪的解决方案(一种与帮助者的预期用途不同的解决方案),那么他们很难理解您为什么按照您的方式做事。
答案 1 :(得分:0)
我想这是因为_path
会生成相对路径,而_url
会生成完整的网址。
现在,当您在控制器中时,_path
帮助程序将尝试重定向到nginx端口,因为它是处理请求的位置。然而,当您在视图中时,相对路径可以正常工作。
我建议您更改为控制器中的_url
。
此外,这些方法是在定义路由时自动创建的,在RESTful路由的情况下,它们遵循可预测的约定。
运行'rake routes'是查看正在生成的所有路由的有用方法。
我建议您阅读http://guides.rubyonrails.org/routing.html以获取更多信息。