2017-10-15 224 views
0

我正在使用aasm statemachine。我有以下事件。它所做的是将状态从​​更改为payment_response_received。所以在改变这个之后,我想调用一个方法verify_payment_response(data)。 我可以通过调用@booking.move_to_payment_response_received!来改变状态,但是如何传递参数以便在回调之后使用?将参数传递给aasm事件

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 
+0

什么是验证点提交后状态机中的数据?即使数据无效,该事件也被解雇了?在事件发生前应该验证数据还是在事件发生时作为验证的一部分?请显示你的控制器方法和'verify_payment_response'方法。 – spickermann

+0

@spickermann我收到2个来源的payment_response。一个来自客户端浏览器js,另一个来自webhook直接来自pg。所以我都没有任何控制。我只想调用'verify_payment_response(data)'一次。因此,无论哪个响应首先将用于'verify_payment_response(data)'。此外,如果签名验证由于某种原因失败,'verify_payment_response'方法会使api调用(后台工作人员)到payment_gateway直接检查状态。所以为了防止这种情况发生,有两次添加了payment_response_received状态 – Abhilash

+0

@spickermann控制器在'if'子句中只有这个'@ booking.move_to_payment_response_received!'。verify_payment_response可以通过2种方法调用(webhook&post request from js在客户端浏览器中)。我不知道哪一个会先开火。但是,哪一个先来我想要使用它。因此,如果状态更改为payment_response_received,则第二个将失败,并且不会再次调用verify_payment_response,这就是此方法的意图。 – Abhilash

回答

1

您可以分配data局部变量触发事件之前:

# 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! 
+0

谢谢队友。工作。我以为会有一种方式,所以没有想到这种方法... :) – Abhilash