문제

나는 최근에 내 앱 중 하나에서 최신 버전의 RESTFUL_AUTHENTICATION (GITHUB)에 대해 AASM 상태를 확장해야했습니다. "Includerization :: Aasmroles"를 제거하고 플러그인에서 기존 상태와 이벤트를 복사하고 내 계정 모델에서 추가 "게시 된"상태를 지원하는 데 필요한 변경 사항을 작성했습니다.

누구든지 이것을 처리 할 수있는 더 깨끗한 방법이 있습니까? 즉, 주 이벤트를 무시합니까? 플러그인을 사용하여 새로운 이벤트를 추가 할 수 있었지만 이미 RESTFUL_AUTH에서 이미 주 이벤트를 무시할 수 없었기 때문에 포함을 제거하고 출발점으로 사용하여 직접 작성해야했습니다.

도움이 되었습니까?

해결책

AAMS에 상태를 추가하면 새로운 상태 객체를 만드는 것으로 구성되며 AAMS :: Statemachine [user] .states 배열에 추가됩니다.

def create_state(name, options)
 @states << AASM::SupportingClasses::State.new(name, options) unless @states.include?(name)
end

여기서 주목해야 할 것은 상태가 설정되면 상태를 무시할 수 없다는 것입니다. 동일한 이름을 가진 상태가 다시 설정되면 Create_state 메소드는 무시합니다. 이 문제를 줄이려면 사용자 모델에서 이와 같은 것을 사용할 수 있습니다.

# this will remove the state with name :name from the states array 
states = AASM::StateMachine[self].states
states.delete(states.find{ |s| s == :name })
# ... so we can define the state here again
aasm_state :name ...

당신이 단지 상태를 재정의한다면 지금은 괜찮을 것입니다. 그러나 상태를 완전히 제거하려면 AASM_STATE 방법의 본문에 정의 된 방법을 정의해야합니다. 다음과 같은 것을 호출 할 수 있어야합니다.

undef_method :name

상황은 이벤트와 동일해야합니다 (코드의 "상태"대신 "이벤트"를 사용). 이상적으로는 AAMS 모듈에 정의 된 메소드를 무시하는 사용자 모델의 클래스 메소드를 만들 수 있습니다. 상태의 경우 다음과 같습니다.

def aasm_state(name, options={})
  states = AASM::StateMachine[self].states
  states.delete(states.find{ |s| s == name.to_sym })
  super(name, options)
end

경고 : 내가 옳지 않을 수도 있습니다. 이 코드는 테스트되지 않았습니다. 방금 AAMS의 소스 코드를 조사하여 알아 냈습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top