第一部分:default resource routing
默认的routing
#复数resource,应用大部分场景
resources :photos #下面是默认生成的路由
GET /photos photos#index photos_path
GET /photos/new photos#new new_photo_path
POST /photos photos#create
GET /photos/:id photos#show photo_path(:id)
GET /photos/:id/edit photos#edit edit_photo_path(:id)
PATCH/PUT /photos/:id photos#update
DELETE /photos/:id photos#destroy
#单数resource, 应用在当前用户上
resource :geocoder
GET /geocoder/new geocoders#new new_geocoder_path
POST /geocoder geocoders#create
GET /geocoder geocoders#show geocoder_path
GET /geocoder/edit geocoders#edit edit_geocoder_path
PATCH/PUT /geocoder geocoders#update
DELETE /geocoder geocoders#destroy
使用namespace(应用于分类)
#使用namespace,下面是一般用法,需要view中建立admin文件夹,controller中建立admin文件夹
namespace :admin do
resources :articles
end
HTTP Verb Path Controller#Action Named Helper
GET /admin/articles admin/articles#index admin_articles_path
GET /admin/articles/new admin/articles#new new_admin_article_path
POST /admin/articles admin/articles#create admin_articles_path
GET /admin/articles/:id admin/articles#show admin_article_path(:id)
GET /admin/articles/:id/edit admin/articles#edit edit_admin_article_path(:id)
PATCH/PUT /admin/articles/:id admin/articles#update admin_article_path(:id)
DELETE /admin/articles/:id admin/articles#destroy admin_article_path(:id)
#namespace第二种情况
#使用namespace中,view中不建立admin文件夹,controller中建立admin文件夹
#即是/articles (without the prefix /admin) to Admin::ArticlesController#
scope module: 'admin' do
resources :articles, :comments
end
#或者
resources :articles, module: 'admin'
#namespace第三种情况
#使用namespace中,controller中不建立admin文件夹,view中建立admin文件夹
#即是/admin/articles to ArticlesController (without the Admin:: module prefix)
scope '/admin' do
resources :articles, :comments
end
#或者
resources :articles, path: '/admin/articles'
nested resource(应用到association中)
#nested resources, 下面是一般用法
#magazine has many ads, ad belongs_to magazine
resources :magazines do
resources :ads
end
#nested resources的第二种用法 shallow nesting
resources :articles do
resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]
#或者
resources :articles do
resources :comments, shallow: true
end
#或者
resources :articles, shallow: true do
resources :comments
resources :quotes
resources :drafts
end
#或者
shallow do
resources :articles do
resources :comments
resources :quotes
resources :drafts
end
end
#nested resources的第三种用法:shallow_path
scope shallow_path: "sekret" do
resources :articles do
resources :comments, shallow: true
end
end
HTTP Verb Path Controller#Action Named Helper
GET /articles/:article_id/comments(.:format) comments#index article_comments_path
POST /articles/:article_id/comments(.:format) comments#create article_comments_path
GET /articles/:article_id/comments/new(.:format) comments#new new_article_comment_path
GET /sekret/comments/:id/edit(.:format) comments#edit edit_comment_path
GET /sekret/comments/:id(.:format) comments#show comment_path
PATCH/PUT /sekret/comments/:id(.:format) comments#update comment_path
DELETE /sekret/comments/:id(.:format) comments#destroy comment_path
#nested resources的第四种用法:shallow_prefix
HTTP Verb Path Controller#Action Named Helper
GET /articles/:article_id/comments(.:format) comments#index article_comments_path
POST /articles/:article_id/comments(.:format) comments#create article_comments_path
GET /articles/:article_id/comments/new(.:format) comments#new new_article_comment_path
GET /comments/:id/edit(.:format) comments#edit edit_sekret_comment_path
GET /comments/:id(.:format) comments#show sekret_comment_path
PATCH/PUT /comments/:id(.:format) comments#update sekret_comment_path
DELETE /comments/:id(.:format) comments#destroy sekret_comment_path
concerns routing(用于复用)
#使用concern代码
concern :commentable do
resources :comments
end
resources :messages, concerns: :commentable
#和上面代码相同
resources :messages do
resources :comments
end
通过对象指定url_path
#一般默认生成的helper方法,参数一般是id,比如article_path(:id),但是按照一般默认形式写的routes可以使用对象作为参数
resources :magazines do
resources :ads
end
#上面的routes可以生
#magazine_ad_path
<%= link_to 'Ad details', magazine_ad_path(@magazine, @ad) %>
<%= link_to 'Ad details', url_for([@magazine, @ad]) %>
<%= link_to 'Ad details', [@magazine, @ad] %>
#magazine_path
<%= link_to 'Magazine details', @magazine %>
#edit_magazine_ad_path
<%= link_to 'Edit Ad', [:edit, @magazine, @ad] %>
定制action
#photos/1/preview
resources :photos do
member do
get 'preview'
end
end
#或者
resources :photos do
get 'preview', on: :member
end
#photos/search
resources :photos do
collection do
get 'search'
end
end
#或者
resources :photos do
get 'search', on: :collection
end
#photos/new/preview
resources :comments do
get 'preview', on: :new
end