Ruby on Rails
モデル状態:AASM
サーチ…
AASMによる基本状態
通常は、状態を含むモデルを作成することになり、その状態はオブジェクトの存続期間中に変化します。
AASMは、オブジェクトのプロセス設計を簡単に通過することに対応して、 有益なステートマシンイネーブラーライブラリです。
あなたのモデルにこのようなことを持たせることは、Railsのベストプラクティスの1つであるFat Model、Skinny Controllerのアイデアと結びついています 。モデルは、状態、その変更、およびそれらの変更によって引き起こされるイベントの生成を管理する責任がある唯一のモデルです。
Gemfileにインストールするには
gem 'aasm'
ユーザーが価格のために製品を引用するAppを考えてみましょう。
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クラスの状態は、プロセスに最適です。
あなたは、前の例のように過去のもの、過去のもの、あるいは他の時制のものと考えることができます。たとえば、価格設定、支払い、配送などです。州の命名はあなた次第です。個人的な観点から見ると、過去の状態は、あなたの最終状態が必ず過去の行動であり、イベント名とのリンクが良好になるため、より効果的です。
注意:あなたはどの名前を使用するか注意してください。あなたはRubyやRuby on Railsの予約済みキーワード( valid
、 end
、 being
など)を使用しないことを心配する必要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には、このプロセスでコールバックが増えているいくつかの方法がありますが、これは有限状態で最初のモデルを作成するのに役立ちます。