2009-10-15 9 views

Répondre

15

L'approche la plus courante consiste à envelopper la variable de classe dans une méthode d'assistance:

# in /app/controllers/foo_controller.rb: 
class FooController < ApplicationController 
    @@bar = 'baz' 

    def my_action 
    end 

    helper_method :bar 

    def bar 
    @@bar 
    end 
end 

# in /app/views/foo/my_action.html.erb: 
It might be a class variable, or it might not, but bar is "<%= bar -%>." 
+0

à peu près la solution évidente, je ne sais pas pourquoi je n'ai pas opté pour cela en premier lieu –

3

Malheureusement, la classe (@@variables) n'est pas copiée dans la vue. Vous pouvez toujours être en mesure d'obtenir à eux via:

controller.instance_eval{@@variable} 

ou

@controller.instance_eval{@@variable} 

ou autre chose de moins grave. 99% sur 100 personnes ne devraient jamais faire cela, ou du moins je ne peux pas trouver une bonne raison.

+0

alors que ce n'est pas ce que je prévois d'utiliser, il répond à ma question initiale –

1

La réponse de Rosen est agréable car il cache ce genre de variable « bar » est, mais si vous avez beaucoup de ces variables, le besoin de définir un tas de méthodes auxiliaires est peu attrayant. J'utilise ce qui suit dans mon contrôleur:

@bar = @@bar ||= some_expensive_call 

De cette façon, « some_expensive_call » ne se fait qu'après, et le résultat est copié dans @bar pour chaque instance (donc le point de vue peut alors y accéder comme @bar).

Questions connexes