Pourquoi les variables d'instance de mon contrôleur ne fonctionnent-elles pas dans les vues (Rails)

StackOverflow https://stackoverflow.com/questions/1412650

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top