2017-10-15 2 views
0

J'utilise aasm statemachine. J'ai l'événement ci-dessous. Cela change l'état de order_created à payment_response_received. Donc, après avoir changé cela, je veux appeler une méthode verify_payment_response(data). Je peux faire ce changement d'état en appelant @booking.move_to_payment_response_received!, mais comment puis-je passer des paramètres à utiliser dans le rappel après?Passer un paramètre à l'événement 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

Quel est le point de vérification de la des données dans la machine d'état après la validation? Même si les données ne sont pas valides, l'événement a été déclenché? Les données doivent-elles être vérifiées avant de déclencher l'événement ou dans le cadre d'une validation pendant que l'événement se produit? Veuillez montrer votre méthode de contrôleur et la méthode 'verify_payment_response' aussi. – spickermann

+0

@spickermann Je reçois le payment_response de 2 sources. Un du navigateur client js et un autre d'un webhook directement de pg. Donc les deux je n'ai aucun contrôle. Je veux seulement appeler le 'verify_payment_response (data)' une seule fois. Donc, quelle que soit la réponse qui vient en premier sera utilisé pour 'verify_payment_response (data)'. De même, si la validation de la signature échoue pour une raison quelconque, la méthode 'verify_payment_response' fait un appel api (worker de fond) à payment_gateway pour vérifier directement l'état. Pour éviter que cela ne se produise deux fois, l'état payment_response_received a été ajouté – Abhilash

+0

@spickermann le contrôleur a seulement cette clause @ dans le cas d'une clause if. La vérification_payment_response peut être invoquée par 2 méthodes (webhook & post request from js dans le navigateur client). Je ne sais pas lequel va tirer en premier. Mais quel que soit le premier, je veux l'utiliser. Donc, si l'état passe à payment_response_received, le second échouera et n'appellera pas encore verify_payment_response et c'est l'intention de cette approche. – Abhilash

Répondre

1

Vous pouvez affecter la data à une variable locale avant de déclencher l'événement:

# 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 

Et utiliser dans votre contrôleur comme ceci:

@booking.payment_response_data = data 
@booking.move_to_payment_response_received! 
+0

Merci compagnon. Travaillé. Je pensais qu'il y aurait un moyen d'aasm donc je n'ai pas pensé à cette approche ... :) – Abhilash