Rails中的控制器(controller)虽然都是类,但是从路由调用同一个控制器方法(action)的时候,每次都会生成一个新的控制器(controller)实例对象。这就导致了,控制器(controller)类中的实例变量名不副实,其作用和普通的局部变量是一样的。考虑如下代码:
def create
@user = User.new(params
[
:user
])
respond_to do |format|
format.html {redirect_to 'show'}
end
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
format.html {redirect_to 'show'}
end
end
def
show
@user = self.class.current_user
#读取类实例变量中的值
end
class << self
#设置类实例属性
atti_accessor
:current_user
end
转载于:https://blog.51cto.com/keepsleeping/970487