Rails中的控制器(controller)虽然都是类,但是从路由调用同一个控制器方法(action)的时候,每次都会生成一个新的控制器(controller)实例对象。这就导致了,控制器(controller)类中的实例变量名不副实,其作用和普通的局部变量是一样的。考虑如下代码:


def create
        @user = User.new(params [ :user ])
         respond_to do |format|
                 format.html {redirect_to 'show'}
         end
end
 
def show
         @user
end

        虽然实例变量@user在create方法中被创建了,但是当浏览器访问show方法的时候,rails会重新实例化一个控制器(controller)对象,而这个新的对象从来都没有调用过create方法,因此对它来说,@user变量并不存在。

       因此,在一个控制器(controller)的不同方法(action)之间共享变量的实质,是在同一个类的不同对象之间去共享一个变量。

        要实现这种共享,目前我所知道的方法有如下几个:一个是类变量(@@开头的变量),第二个是类实例变量(@开头的变量,但不是声明在类实例方法中),靠模仿类变量实现。类变量由于总所周知的原因,我们应该避免使用,下面是使用类实例变量实现改功能的代码。

# 模仿类变量实现该功能的类实例变量代码
def create
        @user = User.new(params [ :user ])
        self.class.current_user = @user   #将需要共享的变量储存在类实例变量之中
         respond_to do |format|
                 format.html {redirect_to 'show'}
         end
end
 
def  show
         @user = self.class.current_user    #读取类实例变量中的值
end
 
class << self          #设置类实例属性
        atti_accessor :current_user
end