web-dev-qa-db-fra.com

@ variables dans Ruby sur Rails

Quelle est la différence entre @title et title? Étant donné que les deux peuvent être des noms de variables. Aussi, comment puis-je choisir le type de variable à utiliser? Avec @ ou pas?

258
OneZero

title est une variable locale. Ils n'existent que dans son champ d'application (bloc actuel)

@title est une variable d'instance - et est disponible pour toutes les méthodes de la classe.

Vous pouvez en lire plus ici: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

Dans Ruby sur Rails - déclarer vos variables dans votre contrôleur en tant que variables d'instance (@title) les met à la disposition de votre vue.

378
Peter Rasmussen

Utilisez @title dans vos contrôleurs lorsque vous souhaitez que votre variable soit disponible dans vos vues.

L'explication est que @title est une variable d'instance et title est une variable locale et que Rails rend les variables d'instance des contrôleurs disponibles pour les vues. Cela est dû au fait que le code du modèle (erb, haml, etc.) est exécuté dans le cadre de l'instance de contrôleur en cours.

29
joscas

La différence est dans la portée de la variable. La @version est disponible pour toutes les méthodes de l'instance de classe.

La réponse courte, si vous êtes dans le contrôleur et que vous devez rendre la variable disponible pour la vue, utilisez ensuite @variable.

Pour une réponse beaucoup plus longue, essayez ceci: http://www.Ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html

25
GSP

@variables sont appelées variables d'instance en Ruby. Ce qui signifie que vous pouvez accéder à ces variables dans N'IMPORTE QUELLE MÉTHODE à l'intérieur de la classe. [Dans toutes les méthodes de la classe]

Les variables sans le symbole @ sont appelées variables locales, ce qui signifie que vous pouvez accéder à ces variables locales uniquement dans That Method. Limité à la portée locale.

Exemple de variables d'instance:

class Customer
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end

  def display_details
    puts "Customer id #{@cust_id}"
    puts "Customer name #{@cust_name}"
    puts "Customer address #{@cust_addr}"
  end
end

Dans l'exemple ci-dessus, @cust_id, @cust_name, @cust_addr sont utilisés dans une autre méthode de la classe. Mais la même chose ne serait pas accessible avec des variables locales.

13
Prabhakar

Un didacticiel sur Qu'est-ce que la portée variable? présente assez bien certains détails;.


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+
5
Hearen

Une variable locale est uniquement accessible depuis le bloc d'initialisation. De plus, une variable locale commence par une lettre minuscule (a-z) ou un trait de soulignement (_).

Et variable d'instance est une instance de self et commence par un @ Une variable d'instance appartient également à l'objet lui-même. Les variables d’instance sont celles sur lesquelles vous exécutez des méthodes sur .send etc.

exemple:

@user = User.all

Le @user est la variable d'instance

Et les variables d'instance non initialisées ont une valeur de Nil

4
Joe Hilton

Les variables @ sont des variables d'instance, sans les variables locales.

En savoir plus sur http://Ruby.about.com/od/variables/a/Instance-Variables.htm

1
John Beynon