1、認識Rails路由配置文件:routes.rb
在Rails應(yīng)用程序中,routes.rb 文件管理著所有用戶從客戶端向服務(wù)器發(fā)送的請求,該如何轉(zhuǎn)化?routes.rb通過分析URL,來確定要調(diào)用哪個控制器的哪個Action方法。
在routes.rb文件中,共列舉了5種主要路由,分別為默認路由(Default Routes)、資源路由(RESTful Routes)、命名路由(Named Routes)、嵌套路由(Nested Routes)、正則路由(Regular Routes)。下面我們來一一學(xué)習(xí)之~~
2、默認路由 Default Routes
顧名思義,默認路由是創(chuàng)建應(yīng)用時,Rails自動生成的,位于routes.rb文件的最后一行。
match ':controller(/:action(/:id(.:format)))'
match '/:controller(/:action(/:id))(.format)'
這是我們在上一章所使用的方式,也是Rails 3.0之前版本的默認方式。其中的括號用法表示可有可無,也就是上述這一行設(shè)定就包括六種路徑方式:
match '/:controller'
match '/:controller/:action'
match '/:controller/:action/:id'
match '/:controller.:format'
match '/:controller/:action.:format'
match '/:controller/:action/:id.:format'
例如,像這樣的網(wǎng)址http://localhost:3000/welcome/say
便會對應(yīng)到welcome controller的say action。典型路由是一種非常簡便的對應(yīng)方式。這種方式的缺點當網(wǎng)站的Action變多的時候,會容易讓Controller的設(shè)計變得混亂沒有規(guī)則。稍后介紹的RESTful路由則是Rails對此提出的組織路由方案。
默認路由由’/'分割為3部分,第一部分解釋為控制器,第二部分解釋為Action方法,第三部分變?yōu)橄鄳?yīng)參數(shù)傳遞。
例如,當有”http:///users/show/1″請求發(fā)生時,Rails去請求users控制器的show方法,并將id=1傳遞給show方法。
match 'meetings/:id', :to => 'events#show'
這里的events#show
表示指向events controller的show action。通常會簡寫成:
match 'meetings/:id' => 'events#show'
注意到在routes.rb中,越上面越優(yōu)先。是如果有網(wǎng)址同時符合多個規(guī)則,會使用最上面的規(guī)則。
3、資源路由 RESTful Routes
資源路由是Rails用來描述資源及其狀態(tài)的,通俗些,就是用來描述數(shù)據(jù)庫表/實體的相關(guān)數(shù)據(jù)操作。
值的注意的是,資源路由巧妙的使用了HTTP響應(yīng),完成了數(shù)據(jù)庫CRUD操作。例如:
這樣就產(chǎn)生了7種不同的路由,用來描述User的數(shù)據(jù)庫操作。如下表所示:
HTTP響應(yīng) | URL | Action方法 | 描述 |
---|
GET | /users | index | 獲取所有user數(shù)據(jù) |
GET | /users/new | new | 跳轉(zhuǎn)到創(chuàng)建user頁面 |
POST | /users | create | 創(chuàng)建新的user |
GET | /users/1 | show | 獲取id=1的user對象 |
GET | /users/1/edit | edit | 編輯id=1的user對象 |
PUT | /users/1 | update | 更新id=1的user對象 |
DELETE | /users/1 | destroy | 刪除id=1的user對象 |
這7中路由完成了資源的所有CRUD操作,與此同時,rails還為資源生成了一些輔助方法:
- users_path : 映射了 index 和 create 方法的路徑 ;
- new_user_path : 映射了 new 方法的路徑 ;
- edit_user_path : 映射了 edit 方法的路徑 ;
- user_path : 映射了 show、update、destroy 方法的路徑 ;
4、命名路由 Named Routes
命名路由可以為任意一個確定的URL定義名稱,該名稱亦可用在控制器方法中,實現(xiàn)頁面提交和重定向。例如:
match 'hello', :to => 'users#index', :as => 'hello'
使用上述代碼后,Rails便知道’hello’需要調(diào)用users控制器的index方法。同時,還為該路由創(chuàng)建了兩個輔助方法:
- hello_path 和 hello_url : 映射了 users#index 方法的路徑 ;
補充: Named Routes可以幫助我們產(chǎn)生URL helper如meetings_url
或meetings_path
,而不需要用{:controller => 'meetings', :action => 'index'}
的方式:
match '/meetings' => 'events#index', :as => "meetings"
其中:as
的部份就會產(chǎn)生一個meetings_path
和meetings_url
的Helpers,_path
和_url
的差別在于前者是相對路徑,后者是絕對路徑。一般來說比較常用_path
方法,除非像是在Email信件中,才必須用_url
提供包含Domain的完整網(wǎng)址。
雖然RESTful已經(jīng)是設(shè)計Rails最常見的路徑模式,但是在一些特殊的情況、不符合CRUD模型的情結(jié)就不一定適用了,例如有多重步驟的窗體(又叫作Wizard) 時,使用命名路由反而會比較簡潔,例如step1_path, step2_path, step3_path
等。
HTTP動詞(Verb)限定
可以透過 :via 參數(shù)指定 HTTP Verb 動詞
match "account/overview" => "account#overview", :via => "get"
match "account/setup" => "account#setup", :via => [:get, :post]
或是
get "account/overview" => "account#overview"
get "account/setup" => "account#setup"
post "account/setup" => "account#setup"
我們可以利用:constraints
設(shè)定一些參數(shù)限制,例如限制:id
必須是整數(shù)。
match "/events/show/:id" => "events#show", :constraints => {:id => /\d/}
另外也可以限定IP位置:
constraints(:ip => /(^127.0.0.1$)|(^192.168.[0-9]{1,3}.[0-9]{1,3}$)/) do
match "/events/show/:id" => "events#show"
5、嵌套路由 Nested Routes
嵌套路由是用于聲明一個資源包含另一個關(guān)聯(lián)資源的訪問方式。例如:博客系統(tǒng)的文章和評論兩個資源就可以這樣描述,因為評論應(yīng)依附于文章存在,不應(yīng)獨立出來。于是便有:
resources :articles do
resources :comments
end
resources :articles, :has_many => :comments
resources :projects do
resources :tasks, :people
end
如此產(chǎn)生的URL Helper如project_tasks_path(@project)
和project_task_path(@project, @task)
,它的網(wǎng)址會如projects/123/tasks和projects/123/tasks/123。
實務(wù)上不建議設(shè)計超過兩層
自定群集路由C
于是,當我們http:///articles/1/comments請求資源時,rails會理解為獲取id=1的那篇文章的所有評論。很直觀,有木有?
6、正則路由 Regular Routes
正則路由的使用概率較低,但它卻能完成非常嚴謹?shù)穆酚稍L問。它可以為每個可變參數(shù)經(jīng)行正則驗證,只有通過驗證的url,才會被指定到定義好的控制器方法中去。簡單舉個例子:
match 'users/search/:id/:age', :controller => 'users', :action => 'search', :age => /[2-5][0-9]/
上面的路由只有在age參數(shù)傳遞在20-59之間時才會被匹配,如http:///users/search/1/25,便會匹配成功;而http:///users/search/1/60,則不會被匹配。
7、路由優(yōu)先級
在Rails中,路由生效的優(yōu)先級是:從routes.rb文件定義的路由中從上到下依次匹配,最早匹配的路由會生效。也就是說routes.rb文件中的路由優(yōu)先級從上到下依次降低。
PS:當沒有任何路由匹配到時,Rails會拋出Routing Error異常。
8、查看當前應(yīng)用路由規(guī)則
查看當前路由規(guī)則時,只需Terminal進入項目目錄,運行下述命令即可: