@(Ruby on Rails)[rails, gem]

1
2
3
4

# AASM is a continuation of the acts-as-state-machine rails plugin, built for plain Ruby objects.
gem 'aasm', '~> 4.12', '>= 4.12.0'

instance method

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
##
# check status
## job.running? # => true
job.may_run? # => false job.aasm.current_state # stage3
job.aasm_state # => 'sleeping'
job.aasm.human_state # => 'sleeping'
job.aasm.states(:permitted => true).map(&:name) # show all permitted states (from initial state)
job.aasm.states(:permitted => false).map(&:name) # show all non permitted states
job.aasm.events.map(&:name) # show all possible (triggerable) events from the current state ##
# change status 的方法要根據在 AASM 中 event 所定義的名稱
##
job.sleep # => triggered :sleep
job.sleep! # => triggered :sleep!

class method

1
Job.aasm.states_for_select  # 產生可以直接套用到 select 的 options

erb 中帶入 select options

1
<%= select_tag :transaction_state, options_for_select(Transaction.aasm.states_for_select), class: '-control' %>

目錄

[TOC]

Automatic Scope

在 AASM 中內建了 Model Scope 讓我們使用:

1
2
# 假設 Order 有 paid 的狀態,那麼可以直接使用
Order.paid

i18n

AASM 支援在 i18n 定義:

1
2
3
4
5
6
7
8
9
10
zh-TW:
activerecord:
attributes:
order:
status/waiting_for_payment: 等待付款
status/paid: 已付款
status/failed: 已出貨
status/canceled: 已逾期
status/expired: 已退款
status/refunded: 已退款

使用範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# ./OnePageShop/app/models/order.rb
class Order < ApplicationRecord
# Concerns macros
include AASM # Attributes related macros
aasm column: 'status', no_direct_assignment: true, requires_lock: true do
# 等待付款
state :waiting_for_payment, initial: true
# 已付款
state :paid
# 已出貨
state :shipped
# 訂單逾期
state :expired
# 已退款
state :refunded after_all_transitions :generate_status_transition_log! event :mark_as_paid do
transitions from: %i(placed waiting_for_payment), to: :paid
end event :mark_as_shipped do
transitions from: :paid, to: :shipped
end event :mark_as_expired do
transitions from: :waiting_for_payment, to: :expired
end event :mark_as_refunded do
transitions from: :paid, to: :refunded
大专栏  [Gem] AASM 狀態機n class="keyword">end
end # ... private
# callback methods
def can_not_be_destroyed
throw :abort
end def generate_status_transition_log!
status_logs.create!(status: aasm.to_state)
end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# ./OnePageShop/app/models/transaction.rb
class Transaction < ApplicationRecord
# Concerns macros
include AASM # Attributes related macros
aasm column: 'status', no_direct_assignment: true, requires_lock: true do
# 等待繳款
state :waiting_for_payment, initial: true
# 已付款
state :paid
# 交易失敗
state :failed
# 取消
state :canceled
# 逾期
state :expired
# 已退款
state :refunded after_all_transitions :generate_status_transition_log! event :mark_as_paid do
transitions from: :waiting_for_payment, to: :paid
end event :mark_as_paid do
transitions from: :waiting_for_payment, to: :failed
end event :mark_as_canceled do
transitions from: :waiting_for_payment, to: :canceled
end event :mark_as_expired do
transitions from: :waiting_for_payment, to: :expired
end event :mark_as_refunded, after: :check_all_transactions_refunded! do
transitions from: :paid, to: :refunded
end
end # callbacks
after_initialize :generate_trade_number
after_create :generate_status_change_log!
after_update :update_order_status! private
# callback methods
def generate_status_change_log!
status_logs.create!(status: aasm.current_state)
end def generate_status_transition_log!
status_logs.create!(status: aasm.to_state)
end def update_order_status!
return if payment_info.nil? if self.paid?
# set all waiting for payment transaction as canceled
self.order.transactions.waiting_for_payment.each do |transaction|
transaction.mark_as_canceled! if transaction.may_mark_as_canceled?
end self.order.mark_as_paid! if self.order.may_mark_as_paid?
end
end def check_all_transactions_refunded!
# 若沒有其餘等待付款或已付款的交易,則將訂單狀態改為已退款
if !Transaction.where(order_id: self.order_id, status: %i(waiting_for_payment paid)).exists?
self.order.mark_as_refunded!
end
end
end

參考

[Gem] AASM 狀態機的更多相关文章

  1. (转帖) 有限狀態機FSM coding style整理 (SOC) (Verilog)

    来源:http://www.codesoso.net/Record/101092_95120_21.html 来源:http://www.cnblogs.com/oomusou/archive/201 ...

  2. 有限狀態機FSM coding style整理 (SOC) (Verilog)

    AbstractFSM在數位電路中非常重要,藉由FSM,可以讓數位電路也能循序地執行起演算法.本文將詳細討論各種FSM coding style的優缺點,並歸納出推薦的coding style. In ...

  3. SSIS 無法將保護的 XML 節點 "DTS:Password" 解密,錯誤為 0x8009000B "機碼用在特定狀態時無效

    发现之前部署的SSIS,执行失败,查看日志 來源: 描述: 無法將保護的 XML 節點 -- ::-- ::-- :: DataReader 來源 [] 描述: System.Exception: S ...

  4. Win10還原成最乾淨的狀態 不必重灌

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  5. Win10還原成最乾淨的狀態

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  6. 檢查RAC狀態

    1.使用srvctl工具檢查RAC當前配置和狀態 $ srvctl config database -h Displays the configuration for the database. Us ...

  7. ES 處於“initializing”狀態,此時主節點正在嘗試將分片分配到集群中的數據節點。 如果您看到分片仍處於初始化或未分配狀態太長時間,則可能是您的集群不穩定的警告信號。

    指標要點: Cluster status: 如果集群狀態為黃色,則至少有一個副本分片未分配或丟失. 搜索結果仍將完成,但如果更多的分片消失,您可能會丟失數據. 紅色的群集狀態表示至少有一個主分片丟失, ...

  8. Flater-Provide狀態管理

    參考來源:http://www.jspang.com/posts/2019/03/01/flutter-shop.html#%E7%AC%AC24%E8%8A%82%EF%BC%9Aprovide%E ...

  9. memcached+狀態模式+工廠方法使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. Excel文件比较工具的使用

    本工具用于比较两个文件夹中对应Excel工作簿中单元格数据是否不同. 如果有内容不同的单元格,就在结果报告中表示出来. 点击如下链接,下载. Excel文件比较工具.rar 解压缩后,看到1个exe文 ...

  2. RL78 RAM GUARD Funtion

    1.段设置 在Section段增加 My_ProtectRAM_n段, 段地址为RAM起始地址+256字节 2.变量定义 #pragma section bss My_ProtectRAM/*My_P ...

  3. drf框架与postman初始

    drf框架 全称:django-rest framework 知识点 """ 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful ...

  4. vue项目环境搭建与组件介绍

    Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...

  5. kaggle——绝地求生游戏最终排名预测

    绝地求生游戏最终排名预测 知识点 数据读取与预览 数据可视化 构建随机森林预测模型 导入数据并预览 先导入数据并预览.本次实验同样来源于 Kaggle 上的一个竞赛: 绝地求生排名预测 ,由于原始数据 ...

  6. 【个人笔记】ximo早期发的脱壳教程——手脱UPX壳

    [个人笔记]ximo早期发的脱壳教程--手脱UPX壳   壳分为两种:压缩壳和加密壳,UPX是一种很简单的压缩壳.   手脱UPX壳: 工具:ExeinfoPE.OD 对象:rmvbfix 方法1:单 ...

  7. Ubuntu中Unable to acquire the dpkg frontend lock解决方案

    根据百度总结三种方式:第三种解决了我的问题 1. ps -e|grep apt-get 结果:6965 ? 00:00:01 apt-get 执行:sudo kill 6965 #强制解锁,会删除文件 ...

  8. jquey ajax 将变量值封装json传入JAVA action获取解析

    最近在做一个小小的功能模块,前台有很多的数据需要传入到后台,前台页面设计如下: 看起来不是很清楚,总之表单中的数据都要提交到后台进行处理,然后插入到数据库,而且是一起提交到后台的,实现的方法大致有两种 ...

  9. ExecutorCompletionService理解记忆

    java.util.concurrent 类 ExecutorCompletionService<V> java.lang.Object   继承者 java.util.concurren ...

  10. Box and Ball

    题目描述 We have N boxes, numbered 1 through N. At first, box 1 contains one red ball, and each of the o ...