2017-12-15 15 views
0

にように私は、@useruserの違いが何であるかを知っていただきたいと思います:Ruby on Railsの@userとuserの違いは何ですか?

@user = User.new 

user = User.new 

一部の人々は、@と@userは、ビューで使用されるインスタンスであると言うが、私ユニットテストですでにこのインスタンスを参照してください。

それでは違いはありますか?目的やセマンティックなことなど何か?

+2

[このポスト](https://stackoverflow.com/questions/3757481/rails-local-variables-versus-instance-variables)で戦利品を取ります。おそらくそれはあなたを助けるかもしれません –

答えて

2

インスタンス@userコントローラで同じインスタンス@userないが、それらは同様の理由で使用しています。

@インスタンス変数は、インスタンスオブジェクトの他のすべてのメソッドで使用できます。

コントローラにあなたが働く

def new 
    @user = User.new 
    apply_another_value_to_user 
end 

def apply_another_value_to_user 
    @user.nickname = 'Zippy' 
end 

を持っている場合。 userのみnew方法内で使用するために定義されているので、あなたがエラー「未定義のローカル変数やメソッド 『ユーザー』を」取得します

def new 
    user = User.new 
    apply_another_value_to_user 
end 

def apply_another_value_to_user 
    user.nickname = 'Zippy' 
end 

代わりにこれを行うと

...。

ユニットテストでは、@userを使用して、テストインスタンス内のさまざまなメソッドでユーザオブジェクトを共有できるようにします。コントローラでは、@userを使用して、コントローラインスタンス内のさまざまなメソッド(およびビュー)でユーザオブジェクトを共有できるようにします。テスト中にコントローラインスタンスが初期化され、両方のインスタンス変数が作成されても、それらは同じ変数ではない可能性があります。

これは、コントローラインスタンス変数にアクセスするために、@userを直接使用することができないため、コントローラインスタンス変数を参照するassigns(:user)を使用する必要があるためです。

expects(assigns(:user).not_to be_nil 
1

ユーザーはローカル変数として定義されています。同じ方法でユーザーを再利用できますが、他の方法では使用できません。

@userはインスタンス変数です。あなたは他の方法でもそれを使うことができます。ユニットテストで

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

'@ user'はクラスのグローバルインスタンスのようですか? –

+0

[@user]はインスタンス変数です。インスタンス自体ではありません。 そのクラスの各インスタンス(オブジェクト)には[@user]が1つあります。クラスの同じインスタンス内のどこからでもアクセスできます。 –

関連する問題