2017-05-24 9 views
0

나는 현재 기본적으로 다음을 수행하는 클래스에서 일하고 있어요AASM 상태 머신 예외 처리 예? ("! get_things"이벤트) :

  • 모델이
  • 데이터를 가져 오는 작성되는
    • 예외가 발생하는 경우, 상태가되어야 성공은, 상태가
,536 "완료"할 필요가있는 경우
  • "실패"

    class Fetcher < ActiveRecord::Base 
        include AASM 
    
        aasm do 
        state :created, initial: true 
        state :success, :failed 
    
        event :succeed do 
         transitions from: :created, to: :success 
        end 
    
        event :fail do 
         transitions from: :created, to: :failed 
        end 
        end 
    
        def read_things!(throw_exception = false) 
        begin 
         raise RuntimeError.new("RAISED EXCEPTION") if throw_exception 
         self.content = open("https://example.com?asd=324").read 
         self.succeed! 
        rescue => e 
         self.fail! 
        end 
        end 
    end 
    
    a = Fetcher.new 
    a.read_things!(throw_exception = true) 
    => state should be failed 
    
    a = Fetcher.new 
    a.read_things!(throw_exception = false) 
    => state should be succeess 
    

    그것은 작동하지만, 할 어떻게 든 정말 좋지 않아 보인다는 ...

    나는 추가 정보

    에 나와있는 오류 처리 같은 것을 선호 :

    나는 다음과 같은 그것을 구현하려고

    event :read_things do 
        before do 
        self.content = open("https://example.com?asd=324").read 
        self.succeed! 
        end 
        error do |e| 
        self.fail! 
        end 
        transitions :from => :created, :to => :success 
    end 
    

    하지만 실제로 여기가 가장 좋은 방법인지 잘 모릅니다.

    나는 또한 위에서 언급 한 오류 처리가 언급 된 것처럼 행동해야하는 많은 이벤트가 있으며 나는 어떻게 든 error_on_all_events를 사용할 수 있음을 알았다. 그러나 그것에 관한 문서는 찾지 못했습니까?

    의견이 있으십니까? 감사!

    편집 : 혼동을 없애기 위해 일부 작은 부품이 변경되었습니다.

  • 답변

    1

    먼저 방법 이름 fetch! 또는 read_things이 있습니까? 어쨌든 예외를 발생 시킬지 여부를 결정하기 위해 부울 인수를 전달하고 싶지는 않습니다. 예외가 다음 발생 경우 rescue 그것을 데리러 :

    def read_things 
        self.content = open("https://example.com?asd=324").read 
        succeed! 
    rescue => e 
        # do something with the error (e.g. log it), otherwise remove the "=> e" 
        fail! 
    end 
    

    내가 읽어

    귀하의 오류 처리 예에 나와있는 오류 처리 같은 것을 선호 실제로 좋습니다 (몇 가지 사소한 편집과) : 실제로

    event :read_things do 
        before do 
        self.content = open("https://example.com?asd=324").read 
        end 
        error do |e| 
        fail! # the self is optional (since self is your Fetcher object) 
        end 
        transitions from: :created, to: :success 
    end 
    

    :

    다음 상태가 successcreated에서 (직접 succeed!를 호출 할 필요를) 전환되지 않습니다 예외를 발생시키지 않습니다 self.content 경우
    a = Fetcher.new 
    a.read_things! 
    

    , 그렇지 않으면 에러 핸들러는 failed에 상태를 전환 시도합니다 fail! 전환, 호출 .

    편집 : AASMerror_on_all_events 콜백의

    사용 예제 :

    aasm do 
        error_on_all_events :handle_error_for_all_events 
    
        state :created, initial: true 
        state :success, :failed 
    
        event :succeed do 
        transitions from: :created, to: :success 
        end 
    
        event :fail do 
        transitions from: :created, to: :failed 
        end 
    end 
    
    def handle_error_for_all_events 
        # inspect the aasm object and handle error... 
        puts aasm 
    end 
    
    +0

    감사합니다, 나는 완전히 잘못 아니에요 듣고 큰. 내 질문에 일부 부분도 지웠다. 혼란에 빠져서 미안하다. error_on_all_events를 사용하는 방법의 예를 보여줄 수도 있습니까? 대단히 감사합니다! thow_exception 매개 변수는 데모 용도로만 사용되었습니다 .. :) – Lichtamberg

    +0

    여러분을 환영합니다! 'error_on_all_events'는'aasm'의 다른 콜백과 같습니다. 'error_on_all_events' 블록을'aasm' 블록 안에 정의 할 수 있습니다 (예를 들어 답변이 업데이트되었습니다). – mmichael