控制器中的实例变量

时间:2013-01-02 10:05:07

标签: ruby-on-rails-3

当我在动作中定义实例变量时,它是否在属于同一个控制器的其他动作中不可用。

实例变量应该在整个班级都可用。正确?

    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会出错?

2 个答案:

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