我们在哪里可以使用Gem AASM?

时间:2016-01-27 19:22:15

标签: ruby-on-rails ruby rubygems

由于我是ROR的新手,我只想了解Gem AASM。实际上,我已经使用AASM Gem构建了Ruby代码。

我很难理解为什么他们在这里使用这个宝石。

我只想知道为什么/何时/何地我们可以使用这个宝石的基本思路。

先谢谢。

1 个答案:

答案 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定义的方法。只能定义状态和定义的转换。