如何从控制器执行AASM中的转换?

时间:2014-10-17 11:24:26

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-4.1 aasm

是否可以使用其名称安全地在AASM中执行转换?

我现在在AASM做的事情:

if order.aasm.events.include? params[:event]
  order.send(params[:event]) 
  order.save
end

我可以在state_machine

中做些什么
order.state_event = params[:event]
order.save

1 个答案:

答案 0 :(得分:0)

你可以加入aasm do阻止吗?我之前没有使用state_machine,但这并不是一个典型的使用aasm的方式。你不应该发送过渡;相反,您只需调用该事件,您的状态转换将根据您创建的事件/转换规则自动发生。

这是一个小例子。

aasm do
  state :draft
  state :review
  state :accepted
  state :rejected

  event :submit do
    transitions :from => :draft, :to => :review
    transitions :from => :review, :to => :accepted
  end

  event :reject do
    transitions :form => :review, :to => :rejected
  end
end

现在,在上面的示例中,如果对象处于草稿状态,并且您调用object.submit它将从draft to review过渡,如果您处于审核状态,object.submit将从review to accepted

另请注意,不是调用事件然后调用save,而是可以将!附加到事件名称,并在转换完成后自动进行保存。

所以而不是

object.submit
object.save

您只需致电

即可
object.submit!