第二部分:non resource routing
这一部分主要采用非resource的方式来制定routes.rb.
bound parameters
#guides中的代码如下所示
get 'photos(/:id)', to: :display
#经过测试,guides中的代码为错误缺少controller,应该指明controller,比如如下所示
get 'photos(/:id)', to: "photos#display"
#注意,guides中的代码为错误
#(/:id)为可选参数,因此/photos, /photos/12, /photos/xx, 都会指向"photos#display"
dynamic segments
#guides中代码
get 'photos/:id/:user_id', to: 'photos#show'
#任何类似url 'photos/xx/yy',都可以得到如下内容
parmas[:id] #=>xx
params[:user_id] #=>yy
static segments
#guides中代码
get 'photos/:id/with_user/:user_id', to: 'photos#show'
#任何类似url 'photos/xx/with_user/yy',都可以得到如下内容
params[:controller] #=>photo
params[:action] #=>show
params[:id] #=>xx
params[:user_id] #=>yy
query string
#guides中代码
get 'photos/:id', to: 'photos#show'
#/photos/1?user_id=2
{controller: 'photos', action: 'show', id: '1', user_id: '2'}
defining defaults
#guides中代码
get 'photos/:id', to: 'photos#show', defaults: { format: 'jpg' }
#photos/12
{controller: 'photos', action: 'show', id: '12', format: 'jpg'}
#另外写法
defaults format: :jpg do
resources :photos
end
naming routes
#guides中代码
get 'exit', to: 'sessions#destroy', as: :logout
#获得如下helper
logout_path, logout_url, 连个helper同时指向url为/exit
http verb constraints
#使用match必须指定verb,如果不指定verb会报错
#约定的verb包括get,post, put, patch, delete
match 'photos', to: 'photos#show', via: [:get, :post]
match 'photos', to: 'photos#show', via: :all
dynamic constraints
#对dynamic params进行限制,经过测试不起作用
get 'photos/:id', to: 'photos#show', constraints: { id: /[A-Z]\d{5}/ }
get 'photos/:id', to: 'photos#show', id: /[A-Z]\d{5}/ #可以省略constraints
get '/:id', to: 'articles#show', constraints: { id: /^\d/ } #这个不行,设置锚定不允许
subdomain constraints
#设置subdomain
constraints subdomain: 'admin' do
resources :articles
end
#必须设定subdomain为admin才可
正则匹配
#guides代码
get 'photos/*other', to: 'photos#unknown'
#photos/12 or /photos/long/path/to/12, setting params[:other] to "12" or "long/path/to/12".
redirection
#重定向
get '/stories', to: redirect('/articles')
get '/stories/:name', to: redirect('/articles/%{name}') #获取前值
#通过block形式获取重定向,参数分别为前值参数和request
get '/stories/:name', to: redirect { |path_params, req| "/articles/#{path_params[:name].pluralize}" }
get '/stories', to: redirect { |path_params, req| "/articles/#{req.subdomain}" }
root
#root定向
root "articles#index"
root to: "articles#index"