我想知道@user
和user
之间有什么区别,例如:
@user = User.new
和
user = User.new
有些人说@user
和@是在视图中使用的实例,但我已经在单元测试中看到了这个实例。
那之间有什么区别吗?在目的或语义或任何东西?
答案 0 :(得分:2)
单元测试中的实例@user
与控制器上的实例@
不同,但出于类似的原因使用它们。
def new
@user = User.new
apply_another_value_to_user
end
def apply_another_value_to_user
@user.nickname = 'Zippy'
end
表示实例变量,它们可以在实例对象的所有其他方法中使用。
如果你在控制器中
def new
user = User.new
apply_another_value_to_user
end
def apply_another_value_to_user
user.nickname = 'Zippy'
end
有效。
如果你做了......
user
您将收到错误“未定义的局部变量或方法'用户'”,因为new
仅定义为在@user
方法中使用。
单元测试使用@user
来确保测试实例中的不同方法可以共享用户对象。控制器使用@user
来确保用户对象可以由控制器实例中的不同方法(和视图)共享。可能是在测试期间初始化控制器实例并且恰好创建了两个@user
实例变量,但它们不是同一个变量。
这就是为什么在测试中,要访问控制器实例变量,不能直接使用assigns(:user)
,必须使用引用控制器实例变量的expects(assigns(:user).not_to be_nil
。
import { Renderer2, RendererFactory2 } from '@angular/core';
@Injectable()
class Service {
private renderer: Renderer2;
constructor(rendererFactory: RendererFactory2) {
this.renderer = rendererFactory.createRenderer(null, null);
}
}
答案 1 :(得分: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