过量使用路由自定义-custom_count(第5条)

时间:2018-11-16 15:35:36

标签: ruby-on-rails routing ruby-on-rails-5

我正在使用rails_best_practices宝石,告诉我我有一个错误:

过度使用路由自定义(customize_count> 8)

  resources :stores do
    collection do
      get :api
    end
    member do
      get :printer
      get :delete
      get :inventory
      delete :inventory
      get :daysheet
      get :detailed_daysheet
      get :labels
      patch :restore
      patch :print_labels
      post :daysheet
    end
  end

产生这些路径:

api_stores_path GET /stores/api(.:format) stores#api
printer_store_path  GET /stores/:id/printer(.:format) stores#printer
delete_store_path GET /stores/:id/delete(.:format)  stores#delete
inventory_store_path  GET /stores/:id/inventory(.:format) stores#inventory
daysheet_store_path GET /stores/:id/daysheet(.:format)  stores#daysheet
detailed_daysheet_store_path  GET /stores/:id/detailed_daysheet(.:format) stores#detailed_daysheet
labels_store_path GET /stores/:id/labels(.:format)  stores#labels
DELETE  /stores/:id/inventory(.:format) stores#inventory
restore_store_path  PATCH /stores/:id/restore(.:format) stores#restore
print_labels_store_path PATCH /stores/:id/print_labels(.:format)  stores#print_labels
POST  /stores/:id/daysheet(.:format)  stores#daysheet

重构后,我需要它像现在使用get/stores/7/inventory之类的/stores/18/printer路由一样继续工作

我如何压缩这些获得的路由以实现相同的路由目标?

1 个答案:

答案 0 :(得分:1)

一种方法是:

resources :stores do
  scope module: :stores do 
    resource  :printer,           only: [:show]
    resource  :daysheet,          only: [:show, :create]
    resource  :detailed_daysheet, only: [:show]
    resource  :inventory,         only: [:show, :destroy]
    resources :labels,            only: [:index]
    resources :print_labels,      only: [:update]
    resource  :restore,           only: [:update]
  end
  collection do
    get :api
  end
  member do
    get :delete
  end
end  

哪个给你:

          store_printer GET    /stores/:store_id/printer(.:format)              stores/printers#show
         store_daysheet GET    /stores/:store_id/daysheet(.:format)             stores/daysheets#show
                        POST   /stores/:store_id/daysheet(.:format)             stores/daysheets#create
store_detailed_daysheet GET    /stores/:store_id/detailed_daysheet(.:format)    stores/detailed_daysheets#show
        store_inventory GET    /stores/:store_id/inventory(.:format)            stores/inventories#show
                        DELETE /stores/:store_id/inventory(.:format)            stores/inventories#destroy
           store_labels GET    /stores/:store_id/labels(.:format)               stores/labels#index
      store_print_label PATCH  /stores/:store_id/print_labels/:id(.:format)     stores/print_labels#update
                        PUT    /stores/:store_id/print_labels/:id(.:format)     stores/print_labels#update
          store_restore PATCH  /stores/:store_id/restore(.:format)              stores/restores#update
                        PUT    /stores/:store_id/restore(.:format)              stores/restores#update
             api_stores GET    /stores/api(.:format)                            stores#api
           delete_store GET    /stores/:id/delete(.:format)                     stores#delete
                 stores GET    /stores(.:format)                                stores#index
                        POST   /stores(.:format)                                stores#create
              new_store GET    /stores/new(.:format)                            stores#new
             edit_store GET    /stores/:id/edit(.:format)                       stores#edit
                  store GET    /stores/:id(.:format)                            stores#show
                        PATCH  /stores/:id(.:format)                            stores#update
                        PUT    /stores/:id(.:format)                            stores#update
                        DELETE /stores/:id(.:format)                            stores#destroy

自然,这要求您创建许多新的嵌套控制器,例如Stores::Printers,它们将驻留在app/controllers/stores/printers_controller.rb中。但是,您现在正在使用标准的RESTful路由,我想有些人的事情是一件好事。

此外,对于嵌套路线,您将在参数中使用:store_id而不是id

collection apimember delete似乎仍然很奇怪,但是我不确定意图是什么。