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)
5条答案
按热度按时间uqjltbpv1#
成员路由需要ID,因为它作用于 * 成员 *。集合路由不需要ID,因为它作用于对象集合。预览是成员路由的一个示例,因为它作用于(并显示)单个对象。搜索是集合路由的一个示例,因为它作用于(并显示)对象集合。
llycmphe2#
fruv7luv3#
Theo的答案是正确的,为了便于说明,我还想指出,这两个函数将生成不同的路径助手。
member {get 'preview'}
将生成:collection {get 'search'}
将生成:注意复数!
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]
7kqas0il5#
简短答案:
member
和collection
块都允许您为资源定义除了Rails将为您生成的七个标准路由之外的其他路由。member
块在资源的单个成员上创建新路由。collection
块为该资源的集合创建新路由。长答案
Rails提供了
member
和collection
块,因此您可以为资源集合和单个资源定义自定义路由。下面是通常为文章资源定义路由的方法。
这将创建以下路由。
但让我们假设你写你的文章在减价,并需要看到预览的文章,因为你写它.
您可以创建一个
PreviewController
,并使用其show
操作显示文章的预览,但在ArticlesController
本身上添加预览操作会很方便。自定义成员路由
下面是如何使用成员块在
ArticlesController
上定义预览路线。它添加一个新路由,将请求定向到
ArticlesController#preview
操作。其余路由保持不变。它还传递params[:id]
中的项目ID,并创建preview_article_path
和preview_article_url
帮助程序。如果您有单一成员路由,请使用速记版本,方法是将
:on
选项传递给该路由,从而消除阻塞。您可以更进一步,省略
:on
选项。它生成以下路由。
这里有两个重要的区别:
1.文章的id为
params[:article_id]
,而不是params[:id]
。1.路径辅助对象将从
preview_article_path
更改为article_preview_path
,并从preview_article_url
更改为article_preview_url
。自定义收集路线
若要为资源的集合添加新路由,请使用集合块。
这将添加以下新路由。它还将添加一个
search_articles_path
和search_articles_url
助手。如果不需要多个
collection
路由,只需将:on
选项传递给该路由。这将添加与上述相同的路由。
结论
Rails允许您使用
member
和collection
块来打破使用七条资源路由的惯例。这两个块都允许您为资源定义标准七条路由之外的其他路由。member
块作用于资源的单个成员,而collection
作用于该资源的集合。来源:Define New Routes Using the Member and Collection Blocks