D-5.Rails route scope

Routes

其实路经身为整个MVCController的门面,却容易被轻忽对待,即使遵照着TDD的概念去开发,可能也会因为不好的习惯,有了多余的路径。
因为resource太方便了

虽然多了一些路径不一定对使用上会有影响,但家里多了没有用处的门,还是会怕怕的。
从前几日的基础API练习中,也可以知道,如果有多的路径,可能就会发生我们原本没预计要有的操作发生。所以DRY过的路径对API开发也非常重要。

所以来复习一下,保持好习惯,永远都让routes.rbDRY


快速复习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开发很重要,只给规定的通道,规定能做的事。


利用resourcesresource制造路径。

resources:对复数资源使用。
resource :对只有单数资源使用。

Rails.application.routes.draw do
  resources :roles
end

对应产生资源。

用了resources後面名词接单数不影响,但请依照Rails惯例使用,复数就用复数名词。

Rails.application.routes.draw do
  resource :boss
end

对应产生资源。

resource後面名词接复数,很顽皮,但也不影响,就没办法依照:id单项处理,想处理复数资源就该用resources

可以利用onlyexpect来限定

Rails.application.routes.draw do
  resources :products, only: [:index, :show]
  #只开index与show,其他都不要。
  resources :roles, expect: [:index, :show]
  #不要index与show,其他都要。
end

collectionmember、与巢状设计。

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/jobsroles/2/job
产生资源

可以看到会把:id带进去网址,可以更明确知道在对哪一个项目做操作。

若只有单一action可以不用block写。
例如:

Rails.application.routes.draw do
  resources :roles do
    get :jobs, on: :member
  end
end

当然也可以resourcesresources

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

会这样,不只路径长,到时要转址,要找带给路径的值会找不完。


Scopenamespace

是的Routes也有scope,但是先认识namespace
namespace可以帮你指定的资源加上字首(前缀),并使用指定modulecontroller,并协助产生绝对路径。

Rails.application.routes.draw do
  resources :roles  #这组产生的资源就不看了。
  namespace :gm do
    resources :roles
  end
end

产生资源。

可以发现/roles前面都多了gm,这被多利用在建立後台系统,当然如果没有建立好完善认证制度,後台就少用admin这种好猜到的。

Scope的用意在更精准的调整你想做的事
想要更多客制化选项的人用的
有三个选项modulepathas

不加任何选项。

Rails.application.routes.draw do
  scope :gm do
    resources :roles
  end
end

产生资源。

可以发现跟namespace非常像,没选项一样为路径加上前缀,不同的地方是使用的controller一样是roles而不是gm/rolespath/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

>>:  Day-25 超简单的Excel判断式

#11 Web Crawler 4

今天,来优化爬虫的速度。 调查问题成因 回顾一下,我们的程序执行了以下步骤: 下载网页 解析网页 合...

map结构的遍历

QVector<Item_Statistics> ItemManager::getAll...

[Day13] 扩充 Boxenn 的 Record Mapper

扩充 Record Mapper 大部分 domain 的 mapper 皆为 key 的转换,而在...

主管与技术团队的分工

我自己是从RD出身的主管,我自己也想了很久,我到底做对了什麽,与可能做错了什麽,让我自己培养出这样的...

[DAY04] 建立 Datastore 和 Dataset (下)

DAY04 建立 Datastore 和 Dataset (下) 今天我们就要把昨天建立好的 dat...