rails URL路由的最權威文檔當然是其官方站點Rails routing from the outside in,我這裏只提幾個文檔中常用的要點。
1.CRUB
resources :photos
2.單例資源
resource :profile
該語句生成的路由如下:
3.嵌入的路由
resources :events do
resources :comments
end
4.namespace和scope路由
namespace :admin do
resources :posts
end
此時,處理該路由的controller是Admin::PostsController,體現在rails工程中是在controller文件夾下的admin文件夾下的posts_controller.rb文件。而產生的路由全部以/admin開頭:
scope module: 'admin' do
resources :posts
end
scope '/admin' do
resources :posts
end
resources :posts, path: '/admin/posts'
該簡寫和使用scope產生的結果完全一樣。不過,path還有另外的用途,如果保持controller及url helper不變,僅僅希望爲url路由中的資源改個名稱,這時path就派上用場了:
resources :posts, path: '/articles'
5.新增RESTful動詞
resources :photos do
get 'preview', on: :member
end
該語句爲某個特定photo新增了一個preview動作,該動作是一個get請求,默認photos_controller中存在一個preview方法處理該動作。
resources :photos do
member do
get 'preview1'=>:pre1, as:"p1"
get 'preview2'=>:pre2, as:"p2"
end
end
6.非resourceful路由
使用參數:
controller :photos do
get 'check/:id',:to=>:check
end
產生的路由輸出如下:
GET /check/:id(.:format) photos#check
在執行該get請求如/check/23,後photos_controller的check方法受理該請求,並在params中將參數設置爲23。
限制參數格式:
get 'photos/:id', to: 'photos#show', constraints: { id: /[A-Z]\d{5}/ }
該路由規則能接受/photos/A12345卻不能接受/photos/893。
指定請求的默認類型:
get 'articles/:id', to: 'articles#show', defaults: { format: 'xml' }
若get請求/articles/2,該路由規則會自動將params的params[:format]置爲"xml"。respond_to :json, :xml
更換資源的controller:
resources :photos, controller: 'images'
此時photos資源的所有請求都由images_controller受理,而photos的路由url和url helper都不變。
限制資源的默認動作:
resources :photos, only: [:index, :show]
或者使用除了destroy動作外的所有默認動作:
resources :photos, except: :destroy
還可以使用:all(所有默認動作),:none(沒有默認動作):resources :photos, :only=>:none
爲new和edit的url路由改名:
resources :photos, path_names: { new: 'make', edit: 'change' }
產生的新路由爲:
/photos/make
/photos/1/change
而此時受理該路由的方法仍爲new和edit,即controller中的方法並未改名。