在修改专案的时候碰上了,
所以就想说顺便记录一下,让自己下次忘记时还能回来翻
因为主要是想讲这两个方法究竟能做什么,所以前面叙述会比较简单一些。
首先因为 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
讲了这么多,也许有人会说
可是我好像不需要这么多路径,这么多看得我眼花撩乱
那我们可以配合only
、except
来达到我们的需求
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
原来collection
与member
差在产生的路径中,会有:id
这个:id
会成为 controller 中params
的一部份。
同样的不想用 do...end 的写法,也可以这样写得到相同的结果。
Rails.application.routes.draw do resources :rackets do delete :cancel, on: :member endend
以上内容皆参考于高见龙,龙哥的书籍
如果需要更详细的内容,欢迎前往为你自己学 Ruby on Rails
希望分享会对你有帮助~