【发布时间】:2011-03-03 00:02:18
【问题描述】:
Rails 中的集合路由和成员路由有什么区别?
例如,
resources :photos do
member do
get :preview
end
end
对
resources :photos do
collection do
get :search
end
end
我不明白。
【问题讨论】:
标签: ruby-on-rails ruby
Rails 中的集合路由和成员路由有什么区别?
例如,
resources :photos do
member do
get :preview
end
end
对
resources :photos do
collection do
get :search
end
end
我不明白。
【问题讨论】:
标签: ruby-on-rails ruby
成员路由需要一个 ID,因为它作用于 成员。集合路由不会,因为它作用于对象集合。预览是成员路由的一个示例,因为它作用于(并显示)单个对象。搜索是集合路径的一个示例,因为它作用于(并显示)对象集合。
【讨论】:
URL Helper Description
----------------------------------------------------------------------------------------------------------------------------------
member /photos/1/preview preview_photo_path(photo) Acts on a specific resource so required id (preview specific photo)
collection /photos/search search_photos_path Acts on collection of resources(display all photos)
【讨论】:
search_photos_path而不是search_photos_url,这样人们就不会认为_path和_url是两者之间的区别。
西奥的答案是正确的。出于文档的考虑,我还想指出,这两者会生成不同的路径助手。
member {get 'preview'} 会生成:
preview_photo_path(@photo) # /photos/1/preview
collection {get 'search'} 将生成:
search_photos_path # /photos/search
注意复数!
【讨论】:
1) :collection - 为对集合进行操作的其他操作添加命名路由。采用#{action} => #{method} 的哈希值,其中method 是:get/:post/:put/:delete,前面的任何一个数组,或者如果方法无关紧要,则为:any。这些路由映射到像 /users/customers_list 这样的 URL,路由为 customers_list_users_url。
map.resources :users, :collection => { :customers_list=> :get }
2) :member - 与 :collection 相同,但适用于在
特定成员。
map.resources :users, :member => { :inactive=> :post }
它被视为/users/1;inactive=> [:action => 'inactive', :id => 1]
【讨论】: