Ruby on rails RubyonRails-在RESTAPI中区分复数资源和单数资源

Ruby on rails RubyonRails-在RESTAPI中区分复数资源和单数资源,ruby-on-rails,ruby,rest,Ruby On Rails,Ruby,Rest,在开始编写任何代码之前,我正在为RESTAPI构建URL。Rails REST magic非常棒,但我对URL的格式有点担心,例如: http://myproject/projects/5 其中Project是我的资源,5是Project_id。我认为如果用户希望检索他们所有的项目,那么相应的HTTP GEThttp://myproject/projects有道理。但是,如果他们希望检索单个资源(如项目)的信息,那么使用http://myproject/project/5vshttp://myp

在开始编写任何代码之前,我正在为RESTAPI构建URL。Rails REST magic非常棒,但我对URL的格式有点担心,例如:

http://myproject/projects/5


其中Project是我的资源,5是Project_id。我认为如果用户希望检索他们所有的项目,那么相应的HTTP GET
http://myproject/projects
有道理。但是,如果他们希望检索单个资源(如项目)的信息,那么使用
http://myproject/project/5
vs
http://myproject/projects/5
。是最好避免这种头痛,还是你们中的一些人也有类似的担忧,甚至更好——有一个有效的解决方案?

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

网站的根是你开始访问任何东西的地方

/项目/将范围缩小到仅项目,而不是其他任何项目。从项目中你可以做很多事情,/list、/index/、/export等等。。。id将事情限制得更远

在每一次会议上,我们所做的事情的范围都变得越来越窄,我认为这是有道理的

进一步的编程都是关于任意规则的。从1和0开始的索引,依此类推。任何使用你的URL的人都会在短时间内把事情整理好。

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


对于路由,有单一资源和复数资源的概念。因此,如果您选择了
resource:account
,那么您将获得类似于
/account
的路径作为默认路径,或者
/account/edit
作为表单的路径来编辑帐户。(请注意,Rails使用
/account
PUT
方法来实际更新帐户。
/account/edit
是编辑帐户的表单,它与帐户本身是一个独立的资源。)但是,如果您使用了
资源:人
,那么您将获得类似
/people
/people/1
,这样的路径,和
/people/1/编辑
。路径本身指示给定类型的资源是否只能有一个实例,或者是否可以有多个实例通过某种类型的标识符进行区分。

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

/应用程序/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
这将生成路由:

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

我说随波逐流。约定胜于配置,记得吗?
    GET     /applications
    GET     /applications/new
    POST    /applications
    GET     /application/:id
    GET     /application/:id/edit
    PUT     /application/:id
    DELETE  /application/:id