Ruby on Rails – 在REST API中区分复数与单数资源

在开始编写任何代码之前,我正在为REST API构建URL。 Rails REST魔术太棒了,但我对URL的格式有点困扰,例如:

http://myproject/projects/5

Project是我的资源,5是project_id。 我想如果用户想要检索他们的所有项目,那么相应的HTTP GET http://myproject/projects是有意义的。 但是,如果他们想要检索单个资源(例如项目)上的信息,那么使用http://myproject/project/5 vs http://myproject/projects/5是有意义的。 是否最好避免这种头痛,或者你们中的一些人有同样的担忧甚至更好 – 有一个有效的解决方案吗?

Rails(3)在单数与复数方面有很多约定。 例如,模型类总是单数( Person ),而相应的表总是复数( people )。 (例如, Person.all映射以select * from people 。)

对于路线,有一个单一资源的概念以及一个复数资源。 因此,如果您使用resource :account那么您将获得路径,例如/account用于默认路径,或者/account/edit用于表单路径以编辑帐户。 (请注意,Rails使用/account使用PUT方法来实际更新帐户PUT /account/edit是一个用于编辑帐户的表单,这是一个与帐户本身不同的资源。)如果你做了resources :people然而, resources :people那么你会得到像/people/people/1/people/1/edit这样的路径。 路径本身指示是否只能存在给定类型资源的一个实例,或者是否可以存在由某种类型的标识符区分的多个实例。

我同意,顺其自然。 考虑URL如何形成层次结构。

您网站的根目录是您开始访问任何内容的地方。

/ projects /将其缩小到只有项目,而不是其他任何东西。 从项目中你可以做很多事情,/ list,/ index /,/ export等… / id进一步限制了事情。

在每个/范围变得更窄,我认为这是有道理的。

进一步的编程都是关于任意规则的。 索引从1开始对0,依此类推。 任何使用您url的人都会在短时间内解决问题。

在某些情况下,资源的单一路径是有用的。 如果您的资源ID是非数字用户定义的名称,则可以进行路由冲突。 例:

/ applications / new – >创建一个新的应用程序或显示用户名为new的应用程序?

在这种情况下,您可以选择限制用户输入以避免冲突,或者,这可以通过覆盖默认的Rails 3行为来解决:

 class ActionDispatch::Routing::Mapper module Resources RESOURCE_OPTIONS << :singular_resource class Resource def member_scope @options[:singular_resource] ? "#{singular}/:id" : "#{path}/:id" end def nested_scope @options[:singular_resource] ? "#{singular}/:#{singular}_id" : "#{path}/:#{singular}_id" end end end end 

然后在指定新资源路由时:

 resources :applications, :singular_resource => true 

这将生成路线:

  GET /applications GET /applications/new POST /applications GET /application/:id GET /application/:id/edit PUT /application/:id DELETE /application/:id