2017-10-15 143 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