2010-11-22 12 views
1

J'ai une variable dont j'ai besoin globalement disponible dans toute mon application (donc j'ai défini @account dans l'applicationController). Cependant, un plugin que j'ai doit avoir accès à la même variable.Accéder aux variables d'application à partir d'un plugin Rails

Remarque: Cette variable est distincte à chaque requête.

Quelle est la meilleure façon de créer cette architecture?

Répondre

0

Peut-être quelque chose comme ceci fonctionne:

class Account 
    def self.current 
    @current 
    # or: Thread.current[:current_account] 
    end 
    def self.current=(a) 
    @current = a 
    # or: Thread.current[:current_account] = a # ..if you want to be thread-safe. 
    end 
    ... 
end 

# your controller's before_filter: 
def assign_account 
    ... 
    Account.current = @account # But remember to set nil if none found! 
end 

# Any code in your app (view, model, almost anything): 
<%= Account.current.name if Account.current %> 
+0

Est-ce que cela fonctionnerait pour que chaque thread soit indépendant? Je ne veux pas traverser les flux entre les utilisateurs ... –

+0

Pour l'instant, les Rails sont généralement mono-thread. Au lieu d'utiliser une variable d'instance '@ current', vous pouvez utiliser' Thread.current [: current_account] 'pour être sûr. – Arsen7

0

La définition de @account dans votre contrôleur d'applications ne le rend pas globalement disponible dans toute l'application - les modèles ne peuvent pas y accéder par exemple. Toute instance var définie dans le contrôleur sera disponible uniquement dans le contrôleur ou les vues. Si les plugins ont un code de contrôleur et de vue, alors ce code devrait pouvoir accéder à la variable de la manière normale, tant que la variable est définie avant que le code du contrôleur de plugin s'exécute par exemple.

Si vous fournissez plus de détails sur ce que vous voulez faire (c'est-à-dire où/comment vous voulez accéder à @account) alors quelqu'un peut être en mesure de suggérer une bonne approche.

+0

@account est situé dans un before_filter à chaque demande. Le plugin ajoute une portée par défaut à certaines requêtes AR –