由于我是ROR的新手,我只想了解Gem AASM。实际上,我已经使用AASM Gem构建了Ruby代码。
我很难理解为什么他们在这里使用这个宝石。
我只想知道为什么/何时/何地我们可以使用这个宝石的基本思路。
先谢谢。
答案 0 :(得分:2)
目的是仅允许属性的定义值,并允许从一个状态到另一个状态的预定义转换。例如,状态A可以在状态B或状态C中传输,但状态B不能在状态C中传输。此外,AASM提供一些回调方法来控制转换或在转换之前或之后执行某些操作。
我在用户模型中使用了AASM,以确保只能以预定义的方式更改用户状态。参见示例:
# THE STATE MACHINE ----------------------------------------------------------
INITIAL_STATE = :pending
STATES = {
INITIAL_STATE => 'new user accounts initial state',
:waiting => 'new user account is waiting for confirmation',
:confirmed => 'user confirmed the registration',
:changing_email => 'user changed its email address',
:blocked => 'user can not log in',
:anonymized => 'personal user data deleted',
:not_deletable => 'can not delete user, because he has some content'
}
include AASM
attr_protected :state
aasm({:column => :state}) do
STATES.keys.each do |key|
state(key, (key == INITIAL_STATE ? {:initial => true} : {}))
end
# creates instance methods confirm, confirm! and confirmed? for later usage
event :confirm do
transitions :to => :confirmed, :from => :waiting
transitions :to => :confirmed, :from => :blocked
transitions :to => :confirmed, :from => :changing_email
transitions :to => :confirmed, :from => :not_deletable
end
end
在事件块中,我定义了如何确认用户状态。因此user.state属性必须是“waiting”,“blocked”,“changing_email”或“not_deleteable”。在这些情况下,您可以调用AASM带来的一些神奇方法。
user.confirmed?
# => false
现在您可以确认用户。
user.confirm
user.state
# => confirmed
或者
user.confirm!
# => true
user.state
# => confirmed
现在
user.confirmed?
# => true
如果我的用户状态为“匿名”,那么我无法确认,并会收到错误消息。这样我的用户实例随时都有明确定义的状态。改变用户状态时我不会犯错误。我只使用AASM定义的方法。只能定义状态和定义的转换。