gpt4 book ai didi

ruby-on-rails - 如何为状态机或有限自动机实现 RESTful 资源

转载 作者:行者123 更新时间:2023-12-03 01:22:27 24 4
gpt4 key购买 nike

我是 Rails 和 REST 新手,我正在尝试找出如何最好地公开由具有状态机(换句话说是有限自动机)的域对象支持的资源。

我见过许多用于使模型类成为状态机的 gem,例如 aasm、转换、工作流,但它们都没有记录如何在面向资源的 Controller 中实际使用它们的示例。它们似乎都暗示状态转换是由“事件”触发的,这实际上是一个方法调用。我对这意味着什么有一些疑问:

  1. 更新操作(PUT 方法)不合适,因为 PUT 被认为是幂等的。唯一可能的情况是状态作为表示的一部分发送。这与“事件”不一致。这是正确的吗?
  2. 由于事件不是幂等的,因此必须使用 POST。但是,到哪个资源呢?每个可能的事件都有一个子资源吗?或者,是否有一个(/updatestate)将要触发的事件以及该事件的任何参数作为其表示形式?
  3. 由于资源的状态是由另一个资源可能触发的事件修改的,因此创建操作是否应该接受对状态属性(或依赖于状态机的任何其他属性)的更改?
  4. [更新的问题] 在 UI 中公开过渡的好方法是什么?由于事件不是状态,因此允许更新状态属性(以及依赖于状态转换的任何其他属性)似乎没有意义。这是否意味着更新操作中应忽略这些属性?

最佳答案

  • The update action (PUT method) is not appropriate because PUT is suppose to be idempotent. The only this would be possible is if the state was sent as part of the representation. This is inconsistet with an "event". Is this correct?

正确。

  • Since, events aren't idempotent, then the a POST must be used. But, to which resource? Is there a subresource for each possible event? Or, is there one (/updatestate) that takes as its representation the event to trigger and any parameters to the event?

两种方法都可以做到。您可以在同一个应用程序中支持这两者,事件类型的变化由传入文档或接收资源决定。就我个人而言,我更喜欢通过不同的文档类型来完成此操作,但这只是我的意见。如果您选择多个资源路线,请确保它们是可发现的(即,通过获取其父资源时返回的文档中描述的每个资源的链接)。

  • Since the state of the resource is modified by an event triggered potentially by another resource, should the create action accept changes to the state attribute (or any other attributes that are dependent on the state machine)?

由你决定;没有真正的理由让你必须密切关注创作的任何特定属性。 (您可以通过说状态在创建后立即更改为状态机的正确初始状态来合理化这一点。)在我完成的状态机中,无论​​如何创建都是通过 POST 进行的(并且是一个不同的 - 相当复杂的 -文档),所以整个事情没有实际意义,但如果您允许多个初始状态,那么在创建文档中采用“这是我首选的起始状态”提示是有意义的。需要明确的是,仅仅因为用户想要它并不意味着你必须这样做;当你拒绝用户的建议时,是否要向用户投诉是你的决定。

  • List item

[股票答案。]

关于ruby-on-rails - 如何为状态机或有限自动机实现 RESTful 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5591348/

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