2010-02-15 18 views
21

J'ai une constante qui n'est utilisée que dans les vues, mais elle est utilisée de différentes manières à différents endroits. C'est un tableau de noms d'options, et est utilisé pour les boîtes de sélection, mais je l'utilise également dans d'autres vues pour voir si les chaînes sont trouvées dans ce tableau, et répondre en conséquence.Meilleure façon de gérer les constantes de vue et d'aide uniquement dans Rails

Quelle est la meilleure façon de gérer cela pour garder DRY?

J'ai initialement créé une constante dans une aide, mais cela ne semble pas être accessible dans les vues.

Depuis, je suis passé à la création d'une méthode dans un assistant, cela ne fait rien sauf renvoyer la constante. Cependant, cela semble vraiment aller à l'encontre de l'esprit de Rails, car maintenant j'utilise essentiellement une constante inférieure.

Je pourrais bien sûr le coller dans un modèle, mais il n'a vraiment rien à voir avec aucun des modèles.

Répondre

35

Vous pouvez définir des constantes dans les aides, mais vous devrez vous y référer par leur nom complet dans vos vues.

application_helper.rb

module ApplicationHelper 
    MyConstant = "something" 
end 

En tout état de cause:

<%= ApplicationHelper::MyConstant %> 
+0

Dans les contrôleurs/modèles, vous pouvez inclure 'includeHelper', pour éviter de le taper. Vous ne pouvez pas le faire à l'intérieur, cependant, pouvez-vous? :/ – m33lky

+0

Il s'avère que tous les modules que vous «inclure» dans le contrôleur est disponible pour les vues. – m33lky

+2

Vous pouvez également écrire une méthode dans l'assistant pour vous y référer afin que vous n'ayez pas à répéter le nom de l'assistant dans la vue. – Will

5

Mettez-le dans config/initializers/constants.rb et il sera disponible partout.

+0

semble un peu malheureux d'ajouter une constante globale quand il ne jamais être utilisé dans les vues et les aides, je ne suis pas sûr c'est mieux que de simplement utiliser une méthode pour l'aliaser. –

+0

FYI - ce n'est plus le cas dans les rails 4 mode de production - les templates vivent dans un espace de nom différent et ont besoin d'accéder aux constantes via ApplicationController: CONSTANT_NAME – Kevin