在state_machine中,如何根据运行事件的结果设置下一个状态?

发布于 2024-11-26 15:30:36 字数 973 浏览 4 评论 0原文

我在我的 Rails3 应用程序中使用 Aaron Pfeifer 的 state_machine gem - 它(仍然)很漂亮。

我有一个事件,其结果在处理后才知道,我想根据结果设置以下状态。此处显示的“明显”方法不起作用:它会引发 ArgumentError: :picked_many is not aknown state value 错误。

根据事件结果设置状态的正确方法是什么? (或者我只是想错了?)

class MyModel < ActiveRecord::Base 
  state_machine :initial => :top do 
    event :pickanumber do
      transition any => any
    end 
    state :picked_zero 
    state :picked_one 
    state :picked_many 
  end 
  def pickanumber(n) 
    self.state = case n 
                 when 0 then :picked_zero 
                 when 1 then :picked_one 
                 else :picked_many 
                 end 
    super
  end 
end 

和一个示例运行:

> m = MyModel.create 
=> #<MyModel id: 26, state: "top", ...>
> m.pickanumber(2) 
ArgumentError: :picked_many is not a known state value

I am using Aaron Pfeifer's state_machine gem in my Rails3 app -- it's (still) nifty.

I have a event whose outcome isn't known until it has been processed, and I would like to set the following state based on the outcome. The 'obvious' approach shown here doesn't work: it raises an ArgumentError: :picked_many is not a known state value error.

What's the right way to set the state based on the outcome of an event? (Or am I just thinking about this wrong?)

class MyModel < ActiveRecord::Base 
  state_machine :initial => :top do 
    event :pickanumber do
      transition any => any
    end 
    state :picked_zero 
    state :picked_one 
    state :picked_many 
  end 
  def pickanumber(n) 
    self.state = case n 
                 when 0 then :picked_zero 
                 when 1 then :picked_one 
                 else :picked_many 
                 end 
    super
  end 
end 

and a sample run:

> m = MyModel.create 
=> #<MyModel id: 26, state: "top", ...>
> m.pickanumber(2) 
ArgumentError: :picked_many is not a known state value

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

停顿的约定 2024-12-03 15:30:36

状态在内部存储为字符串而不是符号。

这应该有效...

def pickanumber(n)
    self.state = case n
                 when 0 then "picked_zero"
                 when 1 then "picked_one"
                 else "picked_many"
                 end
    super
end

State is internally stored as a string and not symbol.

This should work...

def pickanumber(n)
    self.state = case n
                 when 0 then "picked_zero"
                 when 1 then "picked_one"
                 else "picked_many"
                 end
    super
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文