수색…


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의 다른 여러 방법이 있지만 유한 상태의 첫 번째 모델을 만드는 데 도움이됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow