【发布时间】:2016-05-05 05:25:26
【问题描述】:
好的,趁着 GitHub 宕机,一个代码设计问题:
我总是在 Rails 应用程序中使用非标准 RESTful 操作(通常情况下)导致分析瘫痪。
我有工作,我希望能够取消(并重新激活)它们。不是设置一个复选框那么简单;还有一些其他事情需要发生。所以我不能只使用现有的JobsController#update 操作。
这是我看到的选项:
1. 只需将cancel 和reactivate 添加到现有的作业控制器。
路线将类似于:
POST /admin/jobs/cancel/:job_id
POST /admin/jobs/reactivate/:job_id
(不是 RESTful;假设这是个坏主意)
2. 使用create 和destroy 操作创建JobCancellationsController。
重新激活作业是 destroy-ing 一个 JobCancellation 资源。
我将使用如下嵌套路由:
resources :jobs, except: :show do
resource :job_cancellation, only: [:create, :destroy]
end
默认情况下会给我类似的东西
一)
POST /admin/jobs/:job_id/job_cancellation
DELETE /admin/jobs/:job_id/job_cancellation
我可以自己整理路线,而无需更改控制器,就像:
b)
POST /admin/jobs/:job_id/cancellation
DELETE /admin/jobs/:job_id/cancellation
虽然这看起来不是很直观 - '取消'会更好cancel。所以我可以在保持控制器不变的情况下更改路线:
c)
POST /admin/jobs/:job_id/cancel
DELETE /admin/jobs/:job_id/cancel
第一条路线现在有意义(虽然严格来说不是RESTful?),但第二条路线不...“删除作业取消”?因此,您可以将其更改为:
d)
POST /admin/jobs/:job_id/cancel
POST /admin/jobs/:job_id/reactivate
现在路由是有意义的,但看起来很接近上面的选项 1),即使路由确实映射到 JobCancellationsController 中的 RESTful 操作而不是 JobsController 中的非 RESTful 操作。将POST /admin/jobs/:job_id/reactivate 路由映射到JobCancellationsController#destroy 操作似乎非常奇怪。
为了避免与JobCancellationsController#destroy 发生最后的冲突,我可以这样做:
3. 与选项 2 类似,但创建两个控制器:JobCancellationsController 仅具有 create 操作,JobReactivationsController 仅具有 create 操作。
执行此操作的“正确”方法是什么?或者至少,哪些是我可以快速消除的“不正确”方式?有没有我错过的完全不同、更好的方法?
【问题讨论】:
标签: ruby-on-rails rest