使用通用路由有哪些缺点:
match ':controller(/:action(/:id(.:format)))'
我被告知这是不推荐的,但我不明白为什么。用这个会有什么问题?
因为如果您使用相反的顺序':controller(/:id(/:action))'
,则更容易实现REST,并且rails现在有更方便的方法使用显式resource
路由获得适当的HTTP谓词。
理解REST的基本原则将使您更容易公开API,如果您选择沿着包含HTTP原则的路线走下去的话。它还可以防止您做某些不明智的事情,例如使使用GET请求删除记录成为可能。(除非谷歌或你的内部搜索机器人决定将所有链接索引到:delete actions,否则你可能不会发现这个不明智的做法。)
基本思想是GET/Url应该意味着获取资源。当您将操作放在首位时,资源是半模糊的,并且您意外地打开了潜在错误的大门,因为所有HTTP方法都可以用来调用破坏性操作。使用以HTTP动词为中心的方法,可以将UPDATE请求发送到与SHOW请求相同的URL。
对您的问题的具体回答,我理解为理解通用方法的缺点:
一个重要的风险是你让每一个控制器操作(非保护)对你的用户可用。这让他们能够访问你的整个控制器动作"树",这取决于你的情况。
此外,您还为用户提供了GET而不是POST、POST而不是GET的能力,等等。
上面生成的注释很好地解释了这一点。
#注意:此路由将使每个控制器中的所有操作都可以通过GET请求访问。
这意味着理论上您可以在只能通过POST访问的路由上执行GET请求。ie。你可以添加一个名为/postable的路由到一个用户对象,它应该只被POST到,但如果你使用上面的规则,你也可以对它做一个GET请求(带空参数)。
实际上你不会遇到问题。相反,您将失去使用资源路由所获得的优势:
- 帮助简化控制器设计的通用模式
- HTTP动词(
GET
,PUT
,POST
,DELETE
)的免费rest式处理 - 和平、爱与幸福*
你可以通过阅读Rails路由指南找到更多关于资源路由的信息。
*和平、爱和幸福并非在所有地区都能得到。