gpt4 book ai didi

ruby-on-rails - Rails中的非RESTful Action

转载 作者:行者123 更新时间:2023-12-03 16:44:18 26 4
gpt4 key购买 nike

好的,当GitHub出现故障时,会出现一个代码设计问题:
在Rails应用程序中(通常),我总是通过非标准的RESTful Action 使分析瘫痪。

我有乔布斯,我希望能够取消(并重新激活)它们。它不像设置复选框那样简单。还有一些其他事情需要发生。因此,我不能只使用现有的JobsController#update操作。

这是我看到的选项:

1. 只需将cancelreactivate添加到现有的Jobs Controller 中。
路线将类似于:

POST /admin/jobs/cancel/:job_id
POST /admin/jobs/reactivate/:job_id

(不是RESTful;假设这是一个坏主意)

2. 使用 JobCancellationsControllercreate操作创建一个 destroy
重新激活作业是 destroy- 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

我可以整理路由本身,而无需更改 Controller ,就像:

b)
POST /admin/jobs/:job_id/cancellation
DELETE /admin/jobs/:job_id/cancellation

尽管这似乎不是很直观,但是“取消”作为 cancel会更好。因此,我可以在保持 Controller 相同的同时更改路由:

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 Action 而不是 JobsController中的非RESTful Action 也是如此。将 POST /admin/jobs/:job_id/reactivate路由映射到 JobCancellationsController#destroy Action 似乎很奇怪。

为了避免使用 JobCancellationsController#destroy造成最后的麻烦,我可以改为:

3。与选项2相似,但是创建两个 Controller :仅带有 JobCancellationsController操作的 create和仅带有 JobReactivationsController操作的 create

这样做的“正确”方法是什么?或者至少,我可以快速消除哪些“不正确”方法?我错过了一种完全不同的更好的方法吗?

最佳答案

在对Ruby Australia松弛 channel 进行讨论之后,我将建议合并为以下内容:

答案

只需将cancelreactivate添加到现有JobsController即可。

使用此代码:

resources :jobs do
post :cancel, on: :member
post :reactivate, on: :member
end

创建如下路线:
POST /admin/jobs/:job_id/cancel
POST /admin/jobs/:job_id/reactivate

即使不是严格的RESTful,这也很简单直观。

(另一种建议的方法是将状态为已取消的PATCH修补到现有的 update方法;尽管我猜想,对于 cancels和常规 updates,在更新方法中需要有条件)

讨论中出现的其他有用点

出售不是资源的
  • 时,通常会遇到陷阱:“REST是最好的!” (即Jobs是一种资源,但是JobCancellations并不是真正的资源,因此请不要尝试使其成为一种资源)。
  • 如果不需要删除作业的功能,则可以使用destroy操作来取消作业,而不是使用cancel操作。
  • IMO进行完整的REST仅在您不太可能遇到的某些情况下才有用,除非您是大公司。
  • 创建一个有意义的API。 Rails只是提供了轻松进行CRUD的方法。这与 Restful 有关,但还不是全部。
  • 的REST(或HATEOS)方法是让/jobs/1234.json包含cancelLink: {url: "url", method: "POST", rel: "link to the docs"}属性
  • 在构建API时,我们有一个非正式的规则,即如果我们不确定要做什么,我们将复制github所做的事情,就像我们喜欢他们的API一样。
  • ,我使用了很多“休息” API,它们根据休息情况进行了精心设计,但是用作开发人员却很糟糕。比起始终坚持REST(或HATEOS或您今天要关注的任何事物),更重要的是,您A)涵盖了原语,B)使其易于使用。

  • 上面所有这些基本上都指向我总是要告诉自己的建议:“最简单的代码是最重要的。设计模式只有在帮助您实现该目标的范围内才有用。 “无法实现该目标,很可能是您使用不正确,或者将其应用到不正确的情况,或者过于严格地遵循它”。

    关于ruby-on-rails - Rails中的非RESTful Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35051278/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com