Pourquoi les variables d'instance de mon contrôleur ne fonctionnent-elles pas dans les vues (Rails)
-
06-07-2019 - |
Question
J'aimerais ajouter quelques variables d'instance à mon contrôleur, car les variables en question sont requises à partir de la vue de plusieurs actions. Cependant, l'exemple ci-dessous ne fonctionne pas comme je le pensais.
class ExampleController < ApplicationController
@var1 = "Cheese"
@var2 = "Tomato"
def show_pizza_topping
# What I want is the above instance vars from within the view here
end
def show_sandwich_filling
# What I want is the above instance vars from within the view here
end
end
Si je comprends bien, Rails extrait les variables d’instance du contrôleur et les rend disponibles dans la vue. Si j'assigne les mêmes variables dans les méthodes d'action, cela fonctionne bien - mais je ne veux pas le faire deux fois. Pourquoi mon chemin ne fonctionne pas?
(Remarque: cet exemple est un peu nul, mais j'espère que c'est logique)
EDIT: J'ai trouvé la réponse à cette question ici: Quand Ruby les variables d'instance sont définies?
EDIT 2: quel est le meilleur moment pour utiliser des filtres tels que before_filter et la méthode d'initialisation?
La solution
Ces types d'éléments doivent être gérés dans un before_filter
. Comme son nom l'indique, un filtre avant est une méthode qui sera appelée avant toute action, ou uniquement celles que vous déclarez. Un exemple:
class ExampleController < ApplicationController
before_filter :set_toppings
def show_pizza_topping
# What I want is the above instance vars from within the view here
end
def show_sandwich_filling
# What I want is the above instance vars from within the view here
end
protected
def set_toppings
@var1 = "Cheese"
@var2 = "Tomato"
end
end
Vous pouvez également faire en sorte que votre before_filter ne fonctionne que sur l'une de vos actions
before_filter :set_toppings, :only => [ :show_pizza_topping ]
J'espère que cela vous aidera.
EDIT: voici quelques informations supplémentaires sur les filtres. dans ActionController .
Autres conseils
Ce ne sont pas des variables d'instance, n'est-ce pas?
class A
@x = 5
def f
puts @x
end
end
A.new.f
=> nil
Vous le définissez au niveau de la classe, pas au niveau de l'instance. Comme "theIV" souligne que vous devez les affecter dans une méthode d'instance.