2010-12-31 3 views
2

바라건대 이것은 바보 같은 질문이 아니며 Ruby/Rails 상태 머신 (AASM, Transitions, AlterEgo 등)에서 뭔가를 간과하지 않을 것입니다.상태가 변경 될 때 이벤트 전환을 실행하는 Ruby/Rails 상태 머신이 있습니까?

내가 알 수있는 바로는, 이러한 상태 머신 구현은 이벤트가 시작되고 해당 이벤트에 대한 적절한 전환이 이전 상태와 새 상태를 기반으로 트리거된다는 서언에서 작동합니다. 그러나, 그들은 다른 방법으로 작동하지 않는 것; 현재 상태가 새로운 상태로 전환되게하는 이벤트를 시작하는 대신 사용자가 '생성됨'에서 '할당 됨'으로 상태를 변경하고 올바른 전환이 발생하기를 원한다고 가정 해보십시오.

기본적으로 사용자는 사용 가능한 상태의 선택 상자에서 새 상태를 선택하고 적절한 전환, 보호 기능, 성공 콜백 등을 실행할 수 있어야합니다.

기존 상태 시스템 구현이 이것을 지원하는지 아는 사람이 있습니까?

답변

0

gem flojo로하려는 작업을 수행 할 수 있습니다. 상태 다음에 이벤트 이름을 지정하고 해당 이벤트가 와일드 카드 상태에서 드롭 다운에서 선택한 상태로 전환되도록합니다. 양식을 제출 한 후 상태가 아래로 드롭에 "보류"가있는 경우

, 당신은 다음 코드를 사용하여 flojo 이벤트를 구성 할 수 있습니다

event :pending do 
    # :any is a wildcard state and is only valid as a begin state. 
    transition :any, :pending 
end 

, 당신은 다음에 "보류"앞에해야 할 것입니다 "wf_", 기호로 변환 한 다음 개체로 보냅니다. 접두어와 기호 변환을 수행 한 다음 클래스를 전송하도록 위임하는 클래스의 메소드를 작성하는 것이 더 깔끔합니다.

your_object.send :wf_pending 

https://github.com/alternegro/flojo

2

상태 시스템은 본성 상 시스템의 임의 상태로 임의로 건너 뛰는 것을 허용하지 않습니다. 각 항목에는 진입 점이 있으며 상태를 변경하려고 할 때마다 일부 조건이 평가됩니다 (그 중 하나는 입력 이벤트 일 수 있음). 다음 상태는 해당 조건의 결과입니다. 각 상태에서 서로 다른 상태로 전환이 정의 된 상태 시스템을 가질 수 있습니다.

class Ticket 
    acts_as_state_machine :initial => :new 

    state :new 
    state :open 
    state :resolved 

    event :open do 
    transitions :to => :open, 
     :from => [:new, :resolved], :guard => :can_be_open? 
    end 

    event :new do 
    transitions :to => :new, 
     :from => [:open, :resolved], :guard => :can_be_new? 
    end 

    event :resolved do 
    transitions :to => :resolved, 
     :from => [:open, :new], :guard => :can_be_resolved? 
    end 

    private 

    def can_be_resolved? 
    !resolution.blank? 
    end 

    ... 

end 

@ticket = Ticket.create 
@ticket.state # => new 
@ticket.resolved! 
@ticket.state # => resolved 

따라서 드롭 다운에서 원하는 상태를 확인하고 적절한 전환을 호출해야합니다. attr_accessor :new_state과 같은 간단한 것을 사용하고 모델에 before_validation을 호출하는 new_state => event 매핑 또는 case 문을 사용할 수 있습니다.

+0

좋아, 그래서 내가 여기 빼앗아 키 포인트를 추측은 선택 상자 값이 상태 이름이 될 수 있으며, '모델 번호와 함께 사용할 수 있도록 국가 이름과 일치하는 이벤트 이름이있을 수 있습니다 보내기 '를 눌러 이벤트를 트리거하십시오. 권리? – Bryan