Rails 路由:将自定义路由添加到标准操作列表

Posted

技术标签:

【中文标题】Rails 路由:将自定义路由添加到标准操作列表【英文标题】:Rails routing: add a custom route to the standard list of actions 【发布时间】:2021-10-07 18:39:37 【问题描述】:

Rails 路由默认按照 REST 创建 7 个 CRUD 操作。

resources :users

但是,我在几乎所有资源中都使用了confirm_destroy 操作,因为我在确认页面上有很多逻辑;这不仅仅是一个简单的是/否警报对话框。

resources :users do
  get :confirm_destroy, on: :member
end

对于 50 多个资源,为每个资源写出这些内容变得很乏味,因此我的路由文件实际上要长 3 倍。

有没有办法为resources 块添加一个动作到标准 7 中,这样

resources :users

将与

相同
resources :users do
  get :confirm_destroy, on: :member
end

我可以在路线中使用它作为标准动作,即:

resources :users, only: [:show, :confirm_destroy, :destroy]

resources :users, except: [:confirm_destroy]

【问题讨论】:

看看创建路由问题...guides.rubyonrails.org/routing.html#routing-concerns...might 让您接近。否则我想你会进入猴子补丁的领域。 我检查了源代码并同意@dbugger。没有很好的钩子可以改变resources 的行为。猴子修补始终是一种选择,但很脆弱。顾虑是个好主意。另一种选择是创建自己的方法来调用resources + 你的 confirm_destroy 操作 【参考方案1】:

虽然不像您想的那样优雅,但 Rails 的方式是使用路由问题,正如 @dbugger 建议的那样。

例如:

concern :confirmable do
  get 'confirm_destroy', on: :member
end

resources :users, :widgets, concerns: :confirmable
$ rails routes
                                  Prefix Verb   URI Pattern                                                                                       Controller#Action
                    confirm_destroy_user GET    /users/:id/confirm_destroy(.:format)                                                              users#confirm_destroy
                                   users GET    /users(.:format)                                                                                  users#index
                                         POST   /users(.:format)                                                                                  users#create
                                new_user GET    /users/new(.:format)                                                                              users#new
                               edit_user GET    /users/:id/edit(.:format)                                                                         users#edit
                                    user GET    /users/:id(.:format)                                                                              users#show
                                         PATCH  /users/:id(.:format)                                                                              users#update
                                         PUT    /users/:id(.:format)                                                                              users#update
                                         DELETE /users/:id(.:format)                                                                              users#destroy
                  confirm_destroy_widget GET    /widgets/:id/confirm_destroy(.:format)                                                            widgets#confirm_destroy
                                 widgets GET    /widgets(.:format)                                                                                widgets#index
                                         POST   /widgets(.:format)                                                                                widgets#create
                              new_widget GET    /widgets/new(.:format)                                                                            widgets#new
                             edit_widget GET    /widgets/:id/edit(.:format)                                                                       widgets#edit
                                  widget GET    /widgets/:id(.:format)                                                                            widgets#show
                                         PATCH  /widgets/:id(.:format)                                                                            widgets#update
                                         PUT    /widgets/:id(.:format)                                                                            widgets#update
                                         DELETE /widgets/:id(.:format)                                                                            widgets#destroy

【讨论】:

按预期工作!将我的路线文件长度减少了 100 多行,使其更易于阅读。

以上是关于Rails 路由:将自定义路由添加到标准操作列表的主要内容,如果未能解决你的问题,请参考以下文章

将自定义路由添加到 Zend REST 控制器

将自定义奏鸣曲页面路由添加到导航栏

将自定义中间件添加到 Laravel Passport 端点

如何将自定义装饰器添加到 FastAPI 路由?

Rails表单标签不会自定义删除路由,而是转到标准删除路由

Rails:路由到自定义控制器操作