当我在动作中定义实例变量时,它是否在属于同一个控制器的其他动作中不可用。
实例变量应该在整个班级都可用。正确?
class DemoController < ApplicationController
def index
#render('demo/hello')
#redirect_to(:action => 'other_hello')
end
def hello
#redirect_to('http://www.google.co.in')
@array = [1,2,3,4,5]
@page = params[:page].to_i
end
def other_hello
render(:text => 'Hello Everyone')
end
end
如果我在 index 中定义数组并从 hello 视图访问它,那么为什么我的错误值为nil会出错?
答案 0 :(得分:4)
实例变量仅在请求(控制器和视图渲染)期间可用,因为Rails为每个请求创建一个新的控制器实例。
如果您想在请求之间保留数据,请使用sessions。
答案 1 :(得分:0)
如果您在index
操作中定义了一个实例变量,则该变量仅在该操作中可用。如果要为两个操作定义相同的实例变量,可以执行以下两项操作之一:
def index
set_instance_array
...
end
def hello
set_instance_array
...
end
...
private
def set_instance_array
@array = [1,2,3,4,5]
end
如果您经常这样做,可以使用之前的过滤器:
class DemoController < ApplicationController
before_filter :set_instance_array
def index
...
end
...
end
这将在每个请求之前调用set_instance_array方法。有关详细信息,请参阅http://guides.rubyonrails.org/action_controller_overview.html#filters。