无法访问ruby / rails中的类变量?

时间:2013-12-31 19:59:24

标签: ruby-on-rails ruby class inheritance

我有一个类似的课程:

Railsapp / LIB / five9_providers / record_provider.rb:

class Five9Providers::RecordProvider < Five9Providers::BaseProvider

  def add_record_to_list
    variable = 'test'
  end

end

然后,在控制器中我有这个:

Railsapp /应用/控制器/ five9_controller.rb:

class Five9Controller < ApplicationController

    def import
      record_provider = Five9Providers::RecordProvider.new()
      record_provider.add_record_to_list
      puts Five9Providers::RecordProvider::variable
    end

end

但是,调用我的控制器方法import只会返回:

NoMethodError (undefined method 'variable' for Five9Providers::RecordProvider:Class)

如何从variable课程的recover_provider.rb课程中访问five9_controller.rb

编辑:

即使在我的@@variable和我的record_provider中使用five9_controller,我仍然无法访问该变量。我这样称呼它:puts @@variable

2 个答案:

答案 0 :(得分:1)

正如所写,你不能。 variable是实例方法的本地方法,并且不能通过方法外部的任何Ruby表达式访问。

在相关点上,术语“类变量”通常用于表示@@variable形式的变量。

更新:为响应您的“修改”声明,如果您在班级中将variable更改为@@variable,则可以使用从外部访问该变量的技术这个类,但@@variable的裸参考不是其中之一。仔细阅读the question you cited in your comment的答案以获取更多信息。

答案 1 :(得分:0)

最好的方法是使用方法设置和获取值。以下是示例代码

class Planet
  @@planets_count = 0

  def initialize(name)
    @name = name
    @@planets_count += 1
  end

  def self.planets_count
    @@planets_count
  end  

  def self.add_planet
    @@planets_count += 1
  end

  def add_planet_from_obj
    @@planets_count += 1
  end
end


Planet.new("uranus")
Plant.add_planet
obj = Planet.new("earth")
obj.add_planet_from_obj