【问题标题】:Overuse route customizations - customize_count (Rails 5)过度使用路由自定义 - customize_count (Rails 5)
【发布时间】:2018-11-16 15:35:36
【问题描述】:

我正在使用rails_best_practices gem,它告诉我有一个错误:

过度使用路由自定义(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

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

【问题讨论】:

  • 可能使用嵌套资源。你试过什么?
  • @jvillian 我在member do 中尝试了get ':store_action', constraints: { store_action: /printer|delete|inventory|daysheet|detailed_daysheet|labels/ },但这导致了错误。我将如何在这里使用嵌套资源?我在网上搜索了很长时间都没有成功。

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


【解决方案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

当然,这需要您创建许多新的嵌套控制器,例如将驻留在app/controllers/stores/printers_controller.rb 中的Stores::Printers。但是,您现在使用的是标准的 RESTful 路由,我想这对某些人来说是件好事。

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

collection apimember delete 看起来仍然很奇怪,但我不确定其中的意图。

【讨论】:

  • 好吧,诚然,我发现这种方法更难阅读理解,但它似乎确实符合我的要求。我只是有点犹豫是否给它打勾,因为它需要创建几个新资源并且路线不一样(这意味着我需要重构并冒着破坏站点中的多个链接的风险)。不过,我非常感谢您为此所做的工作,如果我没有看到更好的答案,我很乐意将您的答案标记为正确。谢谢!
  • 你的意思是路径名不一样吗?如果这是一个问题,您可以使用 as: 参数来赚钱。 (我会更新代码来演示,但如果这对您来说是错误的方向,那没有太多理由。)我认为唯一不同的路线可能是print_labels。还有其他人吗?
  • 虽然我通常真的很喜欢 rails_best_practices gem,但我认为这是一种情况,它促使我采用一种比我已经使用的解决方案更复杂的解决方案。感谢您为回答这个问题所做的所有工作,但就我而言,我会坚持我的解决方案。希望这个线程将来可以帮助其他人。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多