Ruby on Rails
모델 상태 : AASM
수색…
AASM을 사용한 기본 상태
일반적으로 상태를 포함 할 모델을 생성하게되고 객체의 수명 기간 동안 상태가 변경됩니다.
AASM 은 객체의 프로세스 설계를 쉽게 통과하는 데 도움을 줄 수있는 유한 상태 기계 작동 코드 라이브러리입니다.
당신의 모델에서 이와 같은 것을 가지는 것은 Rails 모범 사례 중 하나 인 Fat Model, Skinny Controller 아이디어와 잘 어울립니다. 모델은 상태, 변경 사항 및 이러한 변경으로 인해 발생하는 이벤트를 생성하는 책임이있는 단독 책임자입니다.
Gemfile에 설치하려면
gem 'aasm'
사용자가 가격에 대해 제품을 인용하는 앱을 생각해보십시오.
class Quote
include AASM
aasm do
state :requested, initial: true # User sees a product and requests a quote
state :priced # Seller sets the price
state :payed # Buyer pays the price
state :canceled # The buyer is not willing to pay the price
state :completed # The product has been delivered.
event :price do
transitions from: requested, to: :priced
end
event :pay do
transitions from: :priced, to: :payed, success: :set_payment_date
end
event :complete do
transitions from: :payed, to: :completed, guard: product_delivered?
end
event :cancel do
transitions from: [:requested, :priced], to: :canceled
transitions from: :payed, to: canceled, success: :reverse_charges
end
end
private
def set_payment_date
update payed_at: Time.zone.now
end
end
그러나 Quote 클래스의 상태는 프로세스에 가장 적합 할 수 있습니다.
앞의 예와 같이 과거와 같거나 다른 시제로 생각할 수있는 국가를 생각할 수 있습니다 (예 : 가격 설정, 지불, 전달 등). 국가의 이름은 당신에게 달려 있습니다. 과거의 상태는 개인적인 관점에서 볼 때 과거의 상태가 더 잘 작동합니다. 왜냐하면 최종 상태가 반드시 과거의 행동 일 것이고 나중에 이벤트 이름과 더 잘 연결되기 때문입니다.
참고 : 어떤 이름을 사용하는지주의하십시오 . valid
, end
, being
등의 루비 또는 루비 온 레일스 예약 키워드를 사용하지 않을까 걱정해야합니다.
상태와 전환을 정의하면 이제 AASM으로 작성된 일부 메소드에 액세스 할 수 있습니다.
예 :
Quote.priced # Shows all Quotes with priced events
quote.priced? # Indicates if that specific quote has been priced
quote.price! # Triggers the event the would transition from requested to priced.
이벤트에 전환이 있음을 알 수 있듯이이 전환은 이벤트 호출시 상태가 변경되는 방식을 결정합니다. 현재 상태로 인해 이벤트가 유효하지 않은 경우 오류가 발생합니다.
이벤트와 전환에는 몇 가지 다른 콜백이 있습니다 (예 :
guard: product_delivered?
product_delivered?
호출 product_delivered?
메소드는 부울을 반환합니다. 거짓으로 판명되면 전환이 적용되지 않으며 다른 전환을 사용할 수없는 경우 상태가 변경되지 않습니다.
success: :reverse_charges
해당 번역이 성공적으로 수행되면 :reverse_charges
메소드가 호출됩니다.
이 과정에서 콜백이 더 많이 포함 된 AASM의 다른 여러 방법이 있지만 유한 상태의 첫 번째 모델을 만드는 데 도움이됩니다.