Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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 将参数传递给aasm事件_Ruby On Rails_Ruby_State Machine_Aasm - Fatal编程技术网

Ruby on rails 将参数传递给aasm事件

Ruby on rails 将参数传递给aasm事件,ruby-on-rails,ruby,state-machine,aasm,Ruby On Rails,Ruby,State Machine,Aasm,我使用的是aasm状态机。我有以下事件。这样做的目的是将状态从创建的订单更改为收到的付款响应。因此,在更改此项后,我想调用一个方法验证支付\u响应(数据)。 我可以通过调用@booking.move\u to\u payment\u response\u received来更改此状态,但如何传递参数以在后回调中使用 event :move_to_payment_response_received do after_commit do self.verify_payment_

我使用的是aasm状态机。我有以下事件。这样做的目的是将状态从创建的订单更改为收到的付款响应。因此,在更改此项后,我想调用一个方法
验证支付\u响应(数据)
。 我可以通过调用
@booking.move\u to\u payment\u response\u received来更改此状态,但如何传递参数以在后回调中使用

event :move_to_payment_response_received do
  after_commit do
         self.verify_payment_response(data) #How can I pass this data param from my controller
  end
  transitions from: :order_created, to: :payment_response_received
end

在触发事件之前,您可以将
数据
分配给局部变量:

# in your model

attr_accessor :payment_response_data

event :move_to_payment_response_received, :after_commit => :verify_payment_response do
  transitions from: :order_created, to: :payment_response_received
end

private

def verify_payment_response
  data = payment_response_data

  # already existing code to verify `data`
end
并在控制器中使用此选项,如下所示:

@booking.payment_response_data = data
@booking.move_to_payment_response_received!

在触发事件之前,您可以将
数据
分配给局部变量:

# in your model

attr_accessor :payment_response_data

event :move_to_payment_response_received, :after_commit => :verify_payment_response do
  transitions from: :order_created, to: :payment_response_received
end

private

def verify_payment_response
  data = payment_response_data

  # already existing code to verify `data`
end
并在控制器中使用此选项,如下所示:

@booking.payment_response_data = data
@booking.move_to_payment_response_received!

提交后在状态机中验证数据有什么意义?即使数据无效,是否触发了事件?数据应该在触发事件之前进行验证,还是在事件发生时作为验证的一部分进行验证?请显示您的控制器方法和验证付款响应的
方法。@spickermann我收到来自两个来源的付款响应。一个来自客户端浏览器js,另一个来自直接来自pg的webhook。所以我没有任何控制权。我只想调用
verify\u payment\u响应(数据)
一次。因此,无论哪个响应先出现,都将用于验证付款响应(数据)
。此外,如果签名验证由于某种原因失败,
验证支付\响应
方法会向支付\网关发出api调用(后台工作程序),以直接检查状态。因此,为了防止这种情况发生两次,添加了收到的付款响应state@spickermann控制器仅收到此
@booking.move\u to\u payment\u response\uif
子句中的code>。。verify_payment_响应可以通过两种方法调用(客户端浏览器中的webhook和来自js的post请求)。我不知道哪一个会先开火。但哪一个先到我想用它。因此,如果状态更改为payment\u response\u received,则第二个将失败,并且不会再次调用verify\u payment\u response,这就是此方法的意图。提交后验证状态机中的数据有什么意义?即使数据无效,是否触发了事件?数据应该在触发事件之前进行验证,还是在事件发生时作为验证的一部分进行验证?请显示您的控制器方法和验证付款响应的
方法。@spickermann我收到来自两个来源的付款响应。一个来自客户端浏览器js,另一个来自直接来自pg的webhook。所以我没有任何控制权。我只想调用
verify\u payment\u响应(数据)
一次。因此,无论哪个响应先出现,都将用于验证付款响应(数据)
。此外,如果签名验证由于某种原因失败,
验证支付\响应
方法会向支付\网关发出api调用(后台工作程序),以直接检查状态。因此,为了防止这种情况发生两次,添加了收到的付款响应state@spickermann控制器仅收到此
@booking.move\u to\u payment\u response\uif
子句中的code>。。verify_payment_响应可以通过两种方法调用(客户端浏览器中的webhook和来自js的post请求)。我不知道哪一个会先开火。但哪一个先到我想用它。因此,如果状态更改为payment\u response\u收到的第二个将失败,并且不会再次调用verify\u payment\u response,这就是此方法的意图。谢谢,伙计。工作。我认为aasm中会有一种方法,所以没有考虑这种方法…:)为什么我没有想到这个?回答得很好。非常感谢。谢谢你,伙计。工作。我认为aasm中会有一种方法,所以没有考虑这种方法…:)为什么我没有想到这个?回答得很好。非常感谢。