collection / member in Ruby 村

在修改专案的时候碰上了,
所以就想说顺便记录一下,让自己下次忘记时还能回来翻
因为主要是想讲这两个方法究竟能做什么,所以前面叙述会比较简单一些。

首先因为 Rails 导入 Restful 网址的设计理念,主要可以让网址变得更直观、易读,
我们可以使用 Rails 内建的resources方法来快速创造出我们所需要的路径

Rails.application.routes.draw do  resources :racketsend

那这到底会产生些什么路径呢?我们启动终端机到专案底下执行rails routes

Prefix | Verb | URI Pattern | Controller#Action
------------- | -------------
rackets | GET | /rackets(.:format) | rackets#index
| POST | /rackets(.:format) | rackets#create
new_racket | GET | /rackets/new(.:format) | rackets#new
edit_racket | GET | /rackets/:id(.:format) | rackets#edit
racket | GET | /rackets/:id(.:format) | rackets#show
| PATCH | /rackets/:id(.:format) | rackets#update
| PUT | /rackets/:id(.:format) | rackets#update
| DELETE | /rackets/:id(.:format) | rackets#destroy

这就把上面做的路径全部显示出来了,就是resources方法办到的
额外补充一下最前面Prefix还有个特殊的魔法:
就是在这些字的后方如果加上_path会得到站内的网址;
而加上_url则会得到完整的网址。
举例来说:

rackets_path => # /racketsnew_racket_path => # /rackets/newedit_racket_path(5) => # /rackets/5/edit  rackets_url => # http://example.com/racketsnew_racket_url => # http://example.com/rackets/newedit_racket_url(5) => # http://example.com/rackets/5/edit  

讲了这么多,也许有人会说

可是我好像不需要这么多路径,这么多看得我眼花撩乱

那我们可以配合onlyexcept来达到我们的需求

Rails.application.routes.draw do  resources :rackets, only: [:index, :show]end# 这样就会得到我们想要的两条路径# 那如果相反的我们除了这两条路径以外都需要Rails.application.routes.draw do  resources :rackets, except: [:index, :show]end# 这样就会得到剩下6条路径啦~

我们在实作的时候,可能又有这样的想法出现

难道我只能使用内建的这些路径吗?

这才要开始进入我们今天要介绍的两位主角collection/member
其实两种方法都能为我们增加路径,至于差别在哪里,让我们继续看下去~

我们想要设计一个情境:如果我想要检视已售出(sold)的球拍

Rails.application.routes.draw do   resources :rackets do    collection do      get :sold    end   endend

我们来看一下这样会产生什么?
Prefix | Verb | URI Pattern | Controller#Action
------------- | -------------
sold_rackets | GET | /rackets/sold | rackets#sold
rackets | GET | /rackets(.:format) | rackets#index
| POST | /rackets(.:format) | rackets#create
new_racket | GET | /rackets/new(.:format) | rackets#new
edit_racket | GET | /rackets/:id(.:format) | rackets#edit
racket | GET | /rackets/:id(.:format) | rackets#show
| PATCH | /rackets/:id(.:format) | rackets#update
| PUT | /rackets/:id(.:format) | rackets#update
| DELETE | /rackets/:id(.:format) | rackets#destroy

/rackets/sold 确实就是我们预期想检视的网址
并且在 controller 中也帮我们指向了 rackets#sold
除了 do...end 这样的写法外,下面的写法也可以得到相同的效果~

Rails.application.routes.draw do   resources :rackets do    get :sold, on: :collection  endend

再来我们看一下 member 的部分
我们一样先来设定一下情境:我想删除2号拍子!

Rails.application.routes.draw do   resources :rackets do    member do      delete :cancel    end   endend

再输入rails routes 看看会出现什么结果?
Prefix | Verb | URI Pattern | Controller#Action
------------- | -------------
cancel_racket | DELETE | /rackets/:id/cancel(.:format) | rackets#cancel
rackets | GET | /rackets(.:format) | rackets#index
| POST | /rackets(.:format) | rackets#create
new_racket | GET | /rackets/new(.:format) | rackets#new
edit_racket | GET | /rackets/:id(.:format) | rackets#edit
racket | GET | /rackets/:id(.:format) | rackets#show
| PATCH | /rackets/:id(.:format) | rackets#update
| PUT | /rackets/:id(.:format) | rackets#update
| DELETE | /rackets/:id(.:format) | rackets#destroy

原来collectionmember差在产生的路径中,会有:id
这个:id会成为 controller 中params的一部份。
同样的不想用 do...end 的写法,也可以这样写得到相同的结果。

Rails.application.routes.draw do  resources :rackets do    delete :cancel, on: :member  endend

以上内容皆参考于高见龙,龙哥的书籍
如果需要更详细的内容,欢迎前往为你自己学 Ruby on Rails
希望分享会对你有帮助~


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章