2017-12-15 4 views
0

Ich möchte wissen, was der Unterschied zwischen @user und user ist, wie in:Was ist der Unterschied zwischen @user und Benutzer in Ruby on Rails?

@user = User.new 

und

user = User.new 

Manche Leute sagen, dass @user mit @ ist eine Instanz in Ansichten verwendet, aber ich Diese Instanz wird bereits bei Komponententests angezeigt.

Gibt es einen Unterschied zwischen dann? In Zweck oder Semantik oder irgendetwas?

+2

Nehmen Sie eine Beute an [diesen Beitrag] (https://stackoverflow.com/questions/3757481/rails-local-variables-versus-instance-variables). Vielleicht kann es Ihnen helfen –

Antwort

2

Die Instanz @user bei Unit-Tests ist nicht die gleiche Instanz @user am Controller, aber sie sind aus ähnlichen Gründen verwendet.

@ bedeuten Instanzvariablen, die in allen anderen Methoden des Instanzobjekts verfügbar sind.

Wenn in einem Controller Sie

def new 
    @user = User.new 
    apply_another_value_to_user 
end 

def apply_another_value_to_user 
    @user.nickname = 'Zippy' 
end 

haben, das funktioniert.

Wenn Sie stattdessen tun ...

def new 
    user = User.new 
    apply_another_value_to_user 
end 

def apply_another_value_to_user 
    user.nickname = 'Zippy' 
end 

Sie haben einen Fehler erhalten „undefiniert lokale Variable oder Methode‚user‘“, weil user nur für die Verwendung innerhalb der new Methode definiert ist.

Komponententests verwenden @user, um sicherzustellen, dass ein Benutzerobjekt von verschiedenen Methoden in der Testinstanz gemeinsam genutzt werden kann. Controller verwenden @user, um sicherzustellen, dass ein Benutzerobjekt von verschiedenen Methoden (und Ansichten) in der Controller-Instanz gemeinsam genutzt werden kann. Es kann sein, dass während eines Tests eine Controller-Instanz initialisiert wird und beide @user Instanzvariablen erstellt werden, aber sie sind nicht die gleiche Variable.

Aus diesem Grund können Sie in einem Test zum Zugriff auf eine Controller-Instanzvariable @user nicht direkt verwenden, sondern assigns(:user) verwenden, der auf die Controller-Instanzvariable verweist.

expects(assigns(:user).not_to be_nil 
1

Benutzer ist als lokale Variable definiert. Sie können Benutzer mit derselben Methode wiederverwenden, aber nicht mit anderen Methoden.

@user ist Instanzvariable. Sie können es auch in anderen Methoden verwenden.

class SomeClass 

    def first_method 
    user = User.new 
    @user = User.new 
    end 

    def second_method 
    # .. 
    # You can use @user here. 
    # But user is undefined in this method. 
    end 

end 
+0

Also '@ user' ist wie eine globale Instanz für die Klasse? –

+0

[@user] ist Instanzvariable. Keine Instanz selbst. Jede Instanz (Object) dieser Klasse hat einen [@user]. Es kann von überall innerhalb derselben Instanz der Klasse zugegriffen werden. –

Verwandte Themen