2012-11-05 3 views
1

우리는 Ruby on Rails 응용 프로그램을 가지고 있습니다.상태에주고받은 Ruby gem AASM 전환 이벤트를 호출하는 방법은 무엇입니까?

우리는 Ruby의 aasm gem을 사용하여 객체 상태를 관리하고 있습니다. 우리가

<pre> 
object.aasm_current_state 
<code> 

를 사용하여 얻을 수있는 객체의 현재 상태를 알고 우리는 또한로 전환 할 수있는 상태를 알고있는 경우

<pre> 
has_state 
aasm do 
    state :created, :initial => true 
    state :submitted 
    state :rejected 
    state :approved 

    event :submit do 
     transitions :to => :submitted, :from => [:created] 
    end 

    event :mark_as_incomplete do 
     transitions :to => :created, :from => [:submitted] 
    end 

    event :approve do 
     transitions :to => :approved, :from => [:submitted] 
    end 

    event :reject do 
     transitions :to => :rejected, :from => [:submitted] 
    end 
end 
<code> 

, 우리는 어떻게 이벤트를 호출 할 수 있습니다?

주 및 주가 변수이므로 위의 내용을 동적으로 수행해야합니다 ( ). 물론 특정 주와 주 조합을 사용하면 전환을 사용할 수 없으므로이 경우 오류를 감지해야합니다.

우리는 또한 어떤 두 국가 조합 (국가 및부터 상태) 만 1 이벤트가있어, 내가 이론적으로있을 수 있다고 생각 사이에서 가정하고 1보다 나는이 달성 될 수 있다고 생각

의심 할 여지없이, 좋은 연습이 아닐 수도있는 aacm 소스 코드 의 내부에 대해 살펴 보겠습니다. 이견있는 사람?

누구나 전에이 작업을했는지 궁금합니다.

감사합니다.

답변

1

AASM에서 제공하는 방법은 없지만 사용자가 원하는 곳에 가까이 다가 갈 수 있습니다. AASM은 상태 시스템이 하나의 상태에서 다른 상태로 여러 다른 전환을 허용한다는 전제하에 구축되었습니다. 이벤트 이름이 관련이 없습니다 경우

,이 같은 이벤트 이름으로에 국가 이름을 다시 수 : 이로써

aasm do 
    ... 
    event :approved do 
    transitions :from => :submitted, :to => :approved 
    end 
    ... 
end 

당신이 단지에 상태를 아는하여 이벤트를 해고 할 수 이름

approval_request.send(to_state) 

기본적으로 AASM은이 전환이 허용되지 않는 경우 예외를 발생시킵니다. 당신은 예외가 마음에 들지 않으면, 다음과 같이 falsewhiny_transitions을 설정

aasm :whiny_transitions => false do 
    ... 
end 
+0

감사합니다. 예, 이것이 효과가 있습니다. 나중에 누군가가 이벤트 이름을 변경하면 작동을 멈 춥니 다. 내 코드는 이벤트 이름에 종속되지 않으므로보다 일반적입니다. 내 코드는 첫 번째 전환점을 사용하지만 두 주에서 찾아서 실행합니다. 말한대로 다른 전환이있을 수 있습니다. –

0

이것은 내가 가지고있는 코드입니다. to_state 및 from_state는 from과 from의 상태입니다.

ApprovalRequest.aasm_events.each do |event_key, event_obj| 
    if event_obj.transitions_from_state?(from_state) && 
     event_obj.transitions_to_state?(to_state) 
     self.approval_request.send "#{event_key.to_s}!" 
    end 
end 

이 구현에 대한 의견이 있으십니까?

+0

당신이 (내 변화가 주요 자식에 병합 될 때까지) aasm 보석의 포크를 얻을 필요가 : https : //로 GitHub의. com/zackxu1/aasm –

+0

이제 나는 transitions_to_state가 필요한 것을 알고있다. ;-) – alto