ruby on rails中集合路由和成员路由之间的区别?

5vf7fwbs  于 2022-11-04  发布在  Ruby
关注(0)|答案(5)|浏览(137)

Rails中的集合路由和成员路由有什么区别?
例如,

resources :photos do
  member do
    get :preview
  end
end

resources :photos do
  collection do
    get :search
  end
end

我不明白你在说什么

uqjltbpv

uqjltbpv1#

成员路由需要ID,因为它作用于 * 成员 *。集合路由不需要ID,因为它作用于对象集合。预览是成员路由的一个示例,因为它作用于(并显示)单个对象。搜索是集合路由的一个示例,因为它作用于(并显示)对象集合。

llycmphe

llycmphe2#

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)
fruv7luv

fruv7luv3#

Theo的答案是正确的,为了便于说明,我还想指出,这两个函数将生成不同的路径助手。
member {get 'preview'}将生成:

preview_photo_path(@photo) # /photos/1/preview

collection {get 'search'}将生成:

search_photos_path # /photos/search

注意复数!

gcxthw6b

gcxthw6b4#

1):collection-为在集合上操作的其他操作添加命名路由。采用#{action} => #{method}的哈希值,其中method为:get/:post/:put/:delete、上述任意值的数组,如果方法无关紧要,则为:any。这些路由Map到类似**/users/customers_list的URL,其路由为customers_list_users_url**。
Map。资源:用户,:集合=〉{:客户列表=〉:获取}
2):member-与:collection相同,但适用于在特定成员上操作的操作。
Map。资源:用户,:成员=〉{:非活动=〉:帖子}
它被视为/users/1;inactive=> [:action => 'inactive', :id => 1]

7kqas0il

7kqas0il5#

简短答案:

membercollection块都允许您为资源定义除了Rails将为您生成的七个标准路由之外的其他路由。

  • member块在资源的单个成员上创建新路由。
  • collection块为该资源的集合创建新路由。

长答案

Rails提供了membercollection块,因此您可以为资源集合和单个资源定义自定义路由。
下面是通常为文章资源定义路由的方法。

resources :articles

这将创建以下路由。

➜ bin/rails routes -g article

      Prefix Verb   URI Pattern                  Controller#Action
    articles GET    /articles(.:format)          articles#index
             POST   /articles(.:format)          articles#create
 new_article GET    /articles/new(.:format)      articles#new
edit_article GET    /articles/:id/edit(.:format) articles#edit
     article GET    /articles/:id(.:format)      articles#show
             PATCH  /articles/:id(.:format)      articles#update
             PUT    /articles/:id(.:format)      articles#update
             DELETE /articles/:id(.:format)      articles#destroy

但让我们假设你写你的文章在减价,并需要看到预览的文章,因为你写它.
您可以创建一个PreviewController,并使用其show操作显示文章的预览,但在ArticlesController本身上添加预览操作会很方便。

自定义成员路由

下面是如何使用成员块在ArticlesController上定义预览路线。

resources :articles do
  member do
    get 'preview'
  end
end

它添加一个新路由,将请求定向到ArticlesController#preview操作。其余路由保持不变。它还传递params[:id]中的项目ID,并创建preview_article_pathpreview_article_url帮助程序。

➜ bin/rails routes -g article

         Prefix Verb   URI Pattern                     Controller#Action
preview_article GET    /articles/:id/preview(.:format) articles#preview

... remaining routes

如果您有单一成员路由,请使用速记版本,方法是将:on选项传递给该路由,从而消除阻塞。

resources :articles do
  get 'preview', on: :member
end

您可以更进一步,省略:on选项。

resources :articles do
  get 'preview'
end

它生成以下路由。

➜  bin/rails routes -g preview

         Prefix Verb URI Pattern                         Controller#Action       
article_preview GET  /articles/:article_id/preview(.:format) articles#preview

这里有两个重要的区别:
1.文章的id为params[:article_id],而不是params[:id]
1.路径辅助对象将从preview_article_path更改为article_preview_path,并从preview_article_url更改为article_preview_url

自定义收集路线

若要为资源的集合添加新路由,请使用集合块。

resources :articles do
  collection do
    get 'search'
  end
end

这将添加以下新路由。它还将添加一个search_articles_pathsearch_articles_url助手。

search_articles GET    /articles/search(.:format)   articles#search

如果不需要多个collection路由,只需将:on选项传递给该路由。

resources :articles do
  get 'search', on: :collection
end

这将添加与上述相同的路由。
结论
Rails允许您使用membercollection块来打破使用七条资源路由的惯例。这两个块都允许您为资源定义标准七条路由之外的其他路由。
member块作用于资源的单个成员,而collection作用于该资源的集合。
来源:Define New Routes Using the Member and Collection Blocks

相关问题