respful_authentication aasm 상태를 확장하는 더 나은 방법
-
07-07-2019 - |
문제
나는 최근에 내 앱 중 하나에서 최신 버전의 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의 소스 코드를 조사하여 알아 냈습니다.