2009-11-16 2 views
2

모든 상태 전환 후에 두 가지 메소드를 호출하고 싶습니다. 지금은하고 있어요 :AASM의 모든 전환에 콜백을 등록 하시겠습니까?

aasm_event :nominate_for_publishing, :before => [:set_state_last_updated_by, :set_state_updated_at] do 
    transitions :to => :under_review, :from => [:work_in_progress] 
    end 

    aasm_event :publish, :before => [:set_state_last_updated_by, :set_state_updated_at] do 
    transitions :to => :published, :from => [:work_in_progress, :under_review], :guard => :is_publishable? 
    end 

    aasm_event :unpublish, :before => [:set_state_last_updated_by, :set_state_updated_at] do 
    transitions :to => :work_in_progress, :from => [:published, :under_review] 
    end 

은 분명히이 가장 좋은 방법이 아니다. 저는 코드를 복제하고 있습니다. 근본적으로 말하자면 콜백을 상태 머신에 실제로 적용 할 때 콜백을 특정 전환과 연관 짓고 있습니다. 이것을 처리하는 더 좋은 방법은 무엇입니까?

답변

2

더티 속성을 사용하여 저장시 상태가 변경되었는지 확인하는 것이 좋을까요? 그래서 같이

,

class Model > ActiveRecord::Base 

    before_save :set_state_updates 

    private 

    def set_state_updates 
    if state_changed? 
     set_state_last_updated_by 
     set_state_updated_at 
    end 
    end 

end 
+0

이것은 기본적으로 1) before_save이어야합니다. 2) AASM 이벤트로 상태를 변경할 필요가 없다면 (즉, 여러분이'state' 속성에 직접 접근하면 여전히 작동 할 것입니다.) –

+0

1) 그래, 아마 편집해서 반영 할 수 있습니다. 그 2) 알아,하지만 내가 생각할 수있는 최상의 솔루션 :( – Ben