会员和收集路线是什么意思?

时间:2011-03-03 15:23:52

标签: ruby-on-rails

阅读本文:http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

添加“会员路线”是什么意思?

或者添加路线到集合?

谈论路线时,会员和集合是什么?

2 个答案:

答案 0 :(得分:57)

它们是在Rails中向基于资源的路由添加其他操作的两种方法。

  
      
  • 成员路由需要ID,因为它会对成员起作用。
  •   
  • 收集路由不需要ID,因为它会对一组对象起作用。
  •   

我喜欢用RESTful URL来考虑它们。考虑资源/模型Foo

的基础知识
GET    /foo            # FooController#index
GET    /foo/:id        # FooController#show
GET    /foo/new        # FooController#new
POST   /foo            # FooController#create
GET    /foo/:id/edit   # FooController#edit
PUT    /foo/:id        # FooController#update
DELETE /foo/:id        # FooController#destroy

请注意:

  • 有些路由有:foo.id的id占位符,因此请参阅特定的 Foo
  • 某些路由没有:id,因此引用所有 Foos(和/或没有特定的foo,如#new和#create)
  • 某些路由(index / create,show / update / destroy)具有相同的URL,并使用HTTP方法区分它们
  • 一些路线(编辑/显示)基本相同(方法和URL前缀),但最后不同的后缀(包括“无后缀”)除外。

会员路线和收集路线允许您使用与上面列出的相同的技术添加其他路线/操作。

成员路由使用您提供的URL后缀和HTTP方法向特定实例添加自定义操作。所以,如果你有:member => { :bar => :get }的成员路线声明。你会得到另一条路线:

GET    /foo/:id/bar # FooController#bar

注意它如何以与`edit'相同的方式重载GET /foo/:id。这是您实现“删除”操作的方式,该操作为“销毁”操作提供UI。

类似地,收集路由会为集合和/或非特定实例添加重载(由您决定其具体含义)。所以,如果你宣布:collection => { :baz => :get },你会得到一条额外的路线:

GET    /foo/baz        # FooController#baz

......与new的方式非常相似。

您还可以自定义HTTP方法。

例如,我最近有一个项目需要Comment的“回复”操作。它与Comment#create(使用POST)基本相同,只是它引用了特定的父Comment。所以,我创建了一个成员路线::member => { :reply => :post }。这给了我:

POST   /comment/:id/reply   # CommentController#reply

这样可以保持路线的安静,同时还可以扩展基本的7个动作。

答案 1 :(得分:11)

内置成员路由为showeditupdatedestroy,因为它们处理单个记录。 index将是一个收集路由,因为它返回一组记录。

所以这取决于你是想对单个记录(成员)还是多个记录(集合)做些什么。

url助手反映单数(成员)和复数(集合)。例如:

这是会员:

person_path(@person)

这是一个集合:

people_path()

如果您定义了自定义收藏路径,则routes.rb

中的内容可能如下所示
resources :people do
  member do
    put :make_manager
  end
  collection do
    get :show_managers
  end
end

让某人成为马槽:

make_manager_person_path(@person)

列出所有经理:

show_managers_people_path()

如果你以不同的方式使用它,我不认为这条路线会“关心”,但这是Rails方式。它将使您的代码更易于阅读,其他编码人员将更容易理解和维护您的代码。