【问题标题】:Instance variable in controllers控制器中的实例变量
【发布时间】:2013-01-02 10:05:07
【问题描述】:

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

实例变量应该在整个类中可用。对吧?

    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 的错误?

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    实例变量仅在请求期间可用(控制器和视图渲染),因为 Rails 会为每个请求创建一个新的控制器实例。

    如果您想在请求之间保留数据,请使用sessions

    【讨论】:

      【解决方案2】:

      如果您在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 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        相关资源
        最近更新 更多