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

Bla*_*man 22 ruby-on-rails

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

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

或者添加路线到集合?

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

Cra*_*ker 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
Run Code Online (Sandbox Code Playgroud)

请注意:

  • 一些路由具有: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
Run Code Online (Sandbox Code Playgroud)

注意它如何GET /foo/:id以"编辑"的方式重载.这是您实现"删除"操作的方式,该操作为"销毁"操作提供UI.

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

GET    /foo/baz        # FooController#baz
Run Code Online (Sandbox Code Playgroud)

......和...一样new.

您还可以自定义HTTP方法.

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

POST   /comment/:id/reply   # CommentController#reply
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的解释,很清楚.谢谢 (3认同)

Wuk*_*ank 11

内置的成员航线show,edit,updatedestroy,因为他们处理的个人纪录.index将是一个收集路线,因为它返回一组记录.

所以这取决于你是想用单个记录(成员)还是多个记录(集合)做某事.

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

这是一个成员:

person_path(@person)
Run Code Online (Sandbox Code Playgroud)

这是一个集合:

people_path()
Run Code Online (Sandbox Code Playgroud)

如果您定义自定义集合路径,它可能在您的routes.rb:

resources :people do
  member do
    put :make_manager
  end
  collection do
    get :show_managers
  end
end
Run Code Online (Sandbox Code Playgroud)

为了让某人成为一个马槽:

make_manager_person_path(@person)
Run Code Online (Sandbox Code Playgroud)

列出所有经理:

show_managers_people_path()
Run Code Online (Sandbox Code Playgroud)

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