【问题标题】:How do I execute transitions in AASM from controller?如何从控制器执行 AASM 中的转换?
【发布时间】:2014-10-17 11:24:26
【问题描述】:

是否可以在 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

【问题讨论】:

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


【解决方案1】:

你能加入你的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 转换。

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

所以不是

object.submit
object.save

你可以直接调用

object.submit! 

【讨论】:

  • 当我说过渡时,我实际上是指事件。我正在尝试通过 API 使对象状态可控。我应该使用object.send("#{params[:event]}!") 执行事件还是有更好的方法?
  • 在这种情况下,您可以按照您描述的方式在对象上使用send。我建议像这样设置您的 aasm do 块 aasm :whiny_transitions => false do 这将仅返回 true 或 false,而不是在事件当前无效时引发异常。它消除了对包含检查的需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2023-03-08
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多