1

이름을 사용하여 AASM에서 전환을 안전하게 실행할 수 있습니까?컨트롤러에서 AASM으로 전환을 어떻게 실행합니까?

나는 AASM 지금 뭘하는지 :

if order.aasm.events.include? params[:event] 
    order.send(params[:event]) 
    order.save 
end 

당신이 당신의 aasm do 블록을 포함 할 수 있습니다 내가 state_machine

order.state_event = params[:event] 
order.save 
+1

를 호출 할 수 https://gist.github.com/ spieker/a01966e2dd586b47b04f –

답변

0

에서 무엇을 할 수 있는지? 나는 전에 state_machine을 사용하지 않았지만, 하나의 typicaly가 aasm을 사용하는 방법이 아닙니다. 전환을 보내지 않아도됩니다. 오히려 방금 이벤트를 호출하면 사용자가 만든 이벤트/전환 규칙을 기반으로 상태 전환이 자동으로 발생합니다.

다음은 작은 예입니다. 객체가 초안 상태이며 object.submit를 호출하는 경우

aasm do 
    state :draft 
    state :review 
    state :accepted 
    state :rejected 

    event :submit do 
    transitions :from => :draft, :to => :review 
    transitions :from => :review, :to => :accepted 
    end 

    event :reject do 
    transitions :form => :review, :to => :rejected 
    end 
end 

지금 위의 예에서, 그것은 draft to review에서 전환을 받고 검토에있는 경우 상태 object.submitreview to accepted에서 전환됩니다.

이벤트를 호출 한 다음 save를 호출하는 대신 이벤트 이름에 !을 추가하면 전환이 완료된 후 자동으로 저장됩니다.

그래서 그 대신

object.submit 
object.save 

의 당신은 단순히 내가 너무 내 프로젝트에서이 필요하고이 작업을 수행 할 수있는 우려를 만들었습니다

object.submit! 
+0

내가 전환을 말했을 때, 나는 실제로 사건을 의미했습니다. API를 통해 객체 상태를 제어 가능하게하려고합니다. 'object.send ("# {params [: event]}!")'를 사용하여 이벤트를 실행해야합니까 아니면 더 좋은 방법이 있을까요? – makhan

+0

그런 경우 설명 된 방법으로 객체에'send'를 사용할 수 있습니다. 나는 당신의 aasm을 이렇게 설정하는 것을 권장합니다.'aasm : whiny_transitions => false do' 이것은 이벤트가 현재 유효하지 않은 경우에 예외를 발생시키는 대신 단순히 true 또는 false를 반환 할 것입니다. 그것은 당신의 포함 체크의 필요성을 제거합니다. – bigtunacan