Idéalement, les données accessibles au contrôleur doivent être transmises en tant que paramètre aux méthodes du modèle. Je vous conseille donc de voir s'il est possible de réécrire votre code. Mais voici deux solutions possibles à votre problème. Je préfère l'approche plus tardive car elle est générique.
Approche 1: Déclarer un attribut virtuel
class CardSignup
attr_accessor call_context
def call_context
@call_context || {}
end
end
Dans votre code du contrôleur:
def create
cs = CardSignup.new(...)
cs.call_context = params
if cs.save
# success
else
# error
end
end
Dans votre modèle CardSignup:
def credit_status_on_create
Organization.find(self.organization_id).update_credits(call_context)
end
Mise à jour du modèle Organisation. Notez le changement à votre logique de compte.
def update_credits
@organization = Organization.find(call_context[:id])
credit_count = @organization.card_signups.count(:conditions =>
{:credit_status => true})
end
Approche 2: Déclarez une variable locale fil accessible à tous les modèles
Votre code de commande:
def create
Thread.local[:call_context] = params
cs = CardSignup.new(...)
if cs.save
# success
else
# error
end
end
Mise à jour du modèle Organization
. Notez le changement à votre logique de compte.
def update_credits
@organization = Organization.find((Thread.local[:call_context] ||{})[:id])
credit_count = @organization.card_signups.count(:conditions =>
{:credit_status => true})
end
Cette solution n'est pas sûre pour les threads. –
Sauf s'il utilise JRuby, il ne sera pas vraiment multithread de toute façon. –