ruby 从回调后停止AASM中的事件而不引发异常

pgvzfuti  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(92)
aasm column: :status, whiny_transitions: false do
  state :requested, initial: true
  state :approved

  event :approve, after: :after_approve do
    transitions from: :requested, to: :approved
  end
end

def after_approve
  raise "This is a test"
end

字符串
鉴于以上所述,我希望能够调用obj.approve!并仍然让它返回true或false,以便我可以处理模型中的异常,向对象添加错误并在控制器中处理它。
我尝试过返回false,错误处理程序等,但似乎没有办法在不引发的情况下从after回调中停止事件,也没有任何方法可以捕获异常处理并返回false(我可以找到)。
作为一种变通方法,我不得不创建一个新方法来 Package 对approve!的调用

def approve_with_errors
    approve!
  rescue StandardError => e
    errors.add(:base, "Error: #{e}")
    false
  end


在aasm中有什么方法可以不添加这些 Package 器就实现这一点吗?
顺便说一下,在Rails中,在回调之后,你需要引发ActiveRecord::RecordInvalid, self,回调链将被中止,但异常不会传递到堆栈。要在before_回调中执行相同的操作,可以执行throw(:abort)https://github.com/rails/rails/issues/33192
我还在AASM Github中创建了一个问题

8cdiaqws

8cdiaqws1#

如果引发ActiveRecord::Rollback(而不是RecordInvalid),那么Rails在回滚数据库后不会将该异常传播到链的上游。所以...

event :approve, after: :after_approve do
      transitions from: :requested, to: :approved

      error do |e|
        errors.add :base, "Error: #{e.message}"
        raise ActiveRecord::Rollback
      end
    end

# ...

> obj.approve!
  ...
  TRANSACTION (0.3ms)  ROLLBACK
nil
> obj.errors
#<ActiveModel::Errors [#<ActiveModel::Error attribute=base, type=Error: This is a test, options={}>]>

字符串

相关问题