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

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

  • 更新操作(PUT方法)不合适,因为假定PUT是幂等的。唯一可能的情况是,状态是作为表示的一部分发送的。这与“事件”不一致。这个对吗?
  • 由于事件不是幂等的,因此必须使用POST。但是,哪个资源呢?每个可能的事件都有子资源吗?或者,是否有一个(/ updatestate)以触发事件和事件的任何参数为代表?
  • 由于资源的状态是由另一个资源可能触发的事件修改的,因此create Action 是否应接受对state属性(或依赖于状态机的任何其他属性)的更改?
  • [更新的问题]在UI中公开转换的好方法是什么?由于事件不是状态,因此允许状态属性(以及依赖状态转换的任何其他属性)进行更新似乎没有意义。这是否意味着在更新操作中应忽略这些属性?
  • 最佳答案



    正确。



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



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



    [股票答案。]

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

    10-14 21:12
    查看更多