其实路经身为整个MVC
中Controller
的门面,却容易被轻忽对待,即使遵照着TDD
的概念去开发,可能也会因为不好的习惯,有了多余的路径。
因为resource
太方便了
虽然多了一些路径不一定对使用上会有影响,但家里多了没有用处的门,还是会怕怕的。
从前几日的基础API
练习中,也可以知道,如果有多的路径,可能就会发生我们原本没预计要有的操作发生。所以DRY
过的路径对API
开发也非常重要。
所以来复习一下,保持好习惯,永远都让routes.rb
很DRY
。
Routes
。首页选择
Rails.application.routes.draw do
root 'welcome#index'
end
对应产生资料。
指定转址
Rails.application.routes.draw do
get "/roles" => redirect("/players")
end
对应产生资源。
也可运用在自制短网址。
依照REST
建立各路径。
Rails.application.routes.draw do
get '/products', to: 'products#index'
post '/products', to: 'products#create'
get '/products/:id', to: 'products#show'
patch '/products/:id', to: 'products#update'
delete '/products/:id', to: 'products#destroy'
end
对应产生资料。
依照REST
去编写路径,对RESTful API
开发很重要,只给规定的通道,规定能做的事。
利用resources
与resource
制造路径。
resources
:对复数资源使用。
resource
:对只有单数资源使用。
Rails.application.routes.draw do
resources :roles
end
对应产生资源。
用了resources
後面名词接单数不影响,但请依照Rails
惯例使用,复数就用复数名词。
Rails.application.routes.draw do
resource :boss
end
对应产生资源。
用resource
後面名词接复数,很顽皮,但也不影响,就没办法依照:id
单项处理,想处理复数资源就该用resources
。
可以利用only
与expect
来限定
Rails.application.routes.draw do
resources :products, only: [:index, :show]
#只开index与show,其他都不要。
resources :roles, expect: [:index, :show]
#不要index与show,其他都要。
end
collection
、member
、与巢状设计。
collection
:如果对资源全体有的其它需求时适合使用。
Rails.application.routes.draw do
resources :roles do
collection do
get :job_warrior
end
end
end
例如有页面想查Role
中是战士的资料,roles/job_warrior
。
产生资源。
member
: 如果对资源中单一项目或特定项目有其它action
时适合使用。
Rails.application.routes.draw do
resources :roles do
member do
get :jobs
post :job
delete :job
end
end
end
roles/2/jobs
,roles/2/job
。
产生资源
可以看到会把:id
带进去网址,可以更明确知道在对哪一个项目做操作。
若只有单一action
可以不用block
写。
例如:
Rails.application.routes.draw do
resources :roles do
get :jobs, on: :member
end
end
当然也可以resources
夹resources
。
Rails.application.routes.draw do
resources :roles do
resources :jobs, only: [:show, :destroy]
end
end
可以产出roles/1/jobs/2
这样的网址。
产生资源
可以很巢,但这样不是很潮。
例如:
Rails.application.routes.draw do
resources :roles do
resources :jobs do
resources :skills do
resource :power
end
end
end
会这样,不只路径长,到时要转址,要找带给路径的值会找不完。
Scope
与namespace
。
是的Routes
也有scope
,但是先认识namespace
。
namespace
可以帮你指定的资源加上字首(前缀),并使用指定module
的controller
,并协助产生绝对路径。
Rails.application.routes.draw do
resources :roles #这组产生的资源就不看了。
namespace :gm do
resources :roles
end
end
产生资源。
可以发现/roles
前面都多了gm
,这被多利用在建立後台系统,当然如果没有建立好完善认证制度,後台就少用admin
这种好猜到的。
Scope
的用意在更精准的调整你想做的事
想要更多客制化选项的人用的
有三个选项module
、path
与as
。
不加任何选项。
Rails.application.routes.draw do
scope :gm do
resources :roles
end
end
产生资源。
可以发现跟namespace
非常像,没选项一样为路径加上前缀,不同的地方是使用的controller
一样是roles
而不是gm/roles
。path/url
未更动。
选项module
Rails.application.routes.draw do
scope module: 'gm' do
resources :roles
end
end
产生资源。
与没有选项相比。路径前缀没了,但是必须用位於指定module的controller。(gm/roles)
选项path
。
Rails.application.routes.draw do
scope module: 'gm', path: 'admin' do
resources :roles
end
end
产生资源。
路径前缀自定义,用哪个controller
自定义,还是path/url
未更动。
选项as
更动path/url
。
Rails.application.routes.draw do
scope module: 'gm', path: 'admin', as: 'gogo' do
resources :roles
end
end
产生资源
可以看到,当有需求可以用scope
来更精准控制。
太麻烦就直接namespace啦!
在路径设定上,是一个新手容易不注重的区块,但有好的门牌号码与路径规划,对controller
设计上也会有好的影响,希望自己不要再用resources
来解决一切了。
<<: 要上传档案,你需要知道的事-stream binary
今天,来优化爬虫的速度。 调查问题成因 回顾一下,我们的程序执行了以下步骤: 下载网页 解析网页 合...
QVector<Item_Statistics> ItemManager::getAll...
扩充 Record Mapper 大部分 domain 的 mapper 皆为 key 的转换,而在...
我自己是从RD出身的主管,我自己也想了很久,我到底做对了什麽,与可能做错了什麽,让我自己培养出这样的...
DAY04 建立 Datastore 和 Dataset (下) 今天我们就要把昨天建立好的 dat...