我已经阅读了文档,但我仍然不确定我是否理解所有内容。
特别是为什么有一个:new
参数。据我了解,它可以用:collection
参数替换。
那么这三种路线有什么区别呢?
不同之处在于生成的 URL。
让我们猜测三个资源:
map.resources :users, :collection => { :rss => :get }
map.resources :users, :member => { :profile => :get }
map.resources :users, :new => { :draft => :get }
第一条路线将创建:
/users/rss
控制器名称和动作名称之间没有任何内容。我们不需要任何其他参数来获取用户的列表 rss 提要。
第二个将创建操作“配置文件”作为对象的成员。所以我们会有:
/users/1/profile
“1”是用户的to_param
. 我们需要一个用户的 id 来显示个人资料。
第三个将创建动作“草稿”作为新动作的成员。所以我们会有:
/users/new/draft
“草稿”操作在接受创建之前显示用户的草稿。
这就是 :collection、:member 和 :new 之间的区别。他们每个人都创建了不同的路线,每条路线都有自己的目的。
:member
用图案创建路径/:controller/:id/:your_method
:collection
使用模式创建路径/:controller/:your_method
:new
使用模式创建路径/:controller/:your_method/new
(请注意路径的最后一个元素,即new
是常量)
New
区别Collection
主要在思想层面。这就是 REST 专家如何看待在更大资源中创建 REST“子资源”。
Damiens 的解释大部分是正确的,除了关于 :new 的部分
在http://guides.rubyonrails.org/routing.html上阅读 ruby on rails 路由指南非常好,它解释了从内到外的路由,然后再返回。第 3.11.3 节(添加新路由)描述了 :new 的作用,它与 :member 和 :collection 非常不同。
基本上 map.resources :photos, :new => { :upload => :post } 将使用 POST HTTP 动词创建 /photos/upload。