0

我正在使用 rails state_machine gem。我有一个带有状态字段的模型领导。我可以使用 state_machine 将状态更改为以前的状态吗?我有一个联系人复选框,当用户单击它时,它将是lead.made_contact!但是当它们未被选中时,它应该被还原。state_machine 会有帮助吗?谢谢。

4

2 回答 2

1

您必须明确定义步骤,例如:

event :next do
  transition from: :without_contact, to: :with_contact
end

event :back do
  transition from: :with_contact, to: :without_contact
end

这样你就可以.next做到.previous

状态机的强大之处在于您必须让对象自己处理。您必须认真考虑授权和非法转换,然后您只需使用事件。

具有非常明确的转换名称通常是非抽象状态机的标志。(看大礼包,基本用一个事件:next,抽象就是总)

于 2013-09-12T12:33:03.437 回答
1

如果您正在使用复选框对交互进行建模,那么在我看来,您唯一可以期待的转换就是切换它。然后,状态消息可以是由该状态机的值确定的虚拟属性。

在这种情况下,状态机可能是矫枉过正的,但假设您为了问题而简化问题,这是另一种解决方法。

class Lead
  state_machine :contact_state, :initial => :unchecked, :namespace => "contact" do
    event :toggle do
      transition :unchecked => :checked, :unless => lambda {|obj| obj.contact_state }
      transition :checked => :unchecked, :if => lambda {|obj| obj.contact_state }
    end

    state :checked, :value => true
    state :unchecked, :value => false
  end

  def status
    contact_state ? "lead.made_contact!" : ""
  end
end

该代码产生以下行为。当然,您可以根据自己的喜好更改命名空间或属性。

irb(main):001:0> lead = Lead.new
=> #<Lead:0x007fccec42c898 @contact_state=false>
irb(main):002:0> lead.contact_state
=> false
irb(main):003:0> lead.status
=> ""
irb(main):004:0> lead.toggle_contact
=> true
irb(main):005:0> lead.contact_state
=> true
irb(main):006:0> lead.status
=> "lead.made_contact!"
irb(main):007:0> lead.toggle_contact
=> true
irb(main):008:0> lead.status
=> ""
于 2014-01-20T09:50:13.713 回答