Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 转换回调后的状态机无法进行更新_Ruby On Rails_State Machine - Fatal编程技术网

Ruby on rails 转换回调后的状态机无法进行更新

Ruby on rails 转换回调后的状态机无法进行更新,ruby-on-rails,state-machine,Ruby On Rails,State Machine,我使用的是Rails-4.2.6、state\u machine-1.2.0和Ruby-2.3 我已经在订单模型上定义了状态机。如下 state_machine :status, initial: :initiated do after_transition on: :succeeded, do: :oderable_success_callback event :pending do transition initiated: :pending end

我使用的是
Rails-4.2.6
、state\u machine-1.2.0和
Ruby-2.3
我已经在订单模型上定义了状态机。如下

  state_machine :status, initial: :initiated do
    after_transition on: :succeeded, do: :oderable_success_callback
    event :pending do
      transition initiated: :pending
    end

    event :failed do
      transition [:initiated, :pending] => :failed
    end

    event :succeeded do
      transition [:initiated, :pending] => :succeeded
    end
  end

  def oderable_success_callback
    orderable.successful_payment
  end
当我像下面这样更新顺序时,触发了_转换回调

order.成功

但当我将订单更新为时,它不会触发回调

order.update(status: 'succeeded')
状态
更新为“
成功
”,但无法触发回调。


如何在正常的
更新
顺序上触发转换后的
回调。转换回调后不会触发更新。如果要检测列上的更改。您可以使用模型的更新后回调

class Order < ActiveRecord::Base
  after_update :tasks
  def tasks
    if(self.status_changed? && status == 'succeeded')
      oderable_success_callback
    end
  end
end
类顺序
根据状态,我有多个回调,并避免了多个if/else,我做了如下操作

 after_update :orderable_callback

 state_machine :status, initial: :initiated do
    event :pending do
      transition initiated: :pending
    end

    event :failed do
      transition [:initiated, :pending] => :failed
    end

    event :succeeded do
      transition [:initiated, :pending] => :succeeded
    end

    state :pending do
      def orderable_callback
        orderable.pending_payment
      end
    end

    state :failed do
      def orderable_callback
        orderable.failed_payment
      end
    end

    state :succeeded do
      def orderable_callback
        orderable.successful_payment
      end
    end
  end

谢谢你的回复。实际上,根据状态,我有多个回调。如果我像这样触发,那么很多If/else需要编写。这很有趣。我不知道你可以像那样定义每个州的方法。但是,如果它处于未定义
orderable\u回调的状态,它会做什么呢?(如:initiated状态)after_update回调不会失败吗?您需要在状态机之外定义orderable_回调方法,如果在状态机中未指定,该方法将被称为默认方法。对于initiated,它将调用default
orderable\u callback