Ruby on Rails中@user和user有什么区别?

时间:2017-12-15 12:38:18

标签: ruby-on-rails ruby ruby-on-rails-5 instance

我想知道@useruser之间有什么区别,例如:

@user = User.new

user = User.new

有些人说@user和@是在视图中使用的实例,但我已经在单元测试中看到了这个实例。

那之间有什么区别吗?在目的或语义或任何东西?

2 个答案:

答案 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