当我访问控制器中的不同操作时,实例变量是否会重置?

时间:2013-04-02 04:47:56

标签: ruby-on-rails ruby

我认为@user是一个实例变量,应该在我访问localhost://users/1后设置,现在如果我导航到localhost://users/new,为什么@user为零?< / p>

class UsersController < ApplicationController
  def new
    # normally you would create a new model and assign it to the instance variable,
    # but if I comment it out, why is it nil instead of keeping the value from show action?
    # @user = User.new
  end

  def show
    @user = User.find(params[:id])
  end
end

2 个答案:

答案 0 :(得分:4)

实例变量仅对请求的范围“实时”。在每个请求期间创建控制器类的新实例。因此,如果您访问show页面,则会使用show方法创建控制器实例。当您访问new时,将销毁当前控制器并创建一个新控制器并调用新方法。

答案 1 :(得分:0)

实例变量的名称以@开头,其范围仅限于自己引用的任何对象。两个不同的对象,即使它们属于同一个类,也允许它们的实例变量具有不同的值。从对象外部,实例变量不能被改变甚至观察(即,ruby的实例变量永远不会公开),除非程序员明确提供了任何方法。与全局变量一样,实例变量在初始化之前具有零值。 有关详细信息,请参阅 http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/