在 RoR 中,如何让我的服务 class 的子 class 识别其超级 class 中的 class 变量?

In RoR, how do I get a subclass of my service class to recognize a class variable in its super class?

我正在使用 Rails 4.2.5。我有这个超级class

class AbstractImportService

  def initialize(params)
    @init_url = params[:init_url]
  end

  private

    attr_reader :init_url

然后这个class继承自它

class MyService < AbstractImportService

  def self.my_method(runner_id)
     puts "init_url: #{@init_url}"
     …
  end

问题是,在方法“self.my_method”中,puts 行打印出“init_url:”,即使我最初将 @init_url 指向某物。 Rails 没有受保护的概念,所以有没有另一种方法可以让子 class 识别超级 class 的 class 成员变量?

@init_url = params[:init_url] 是一个实例变量,所以你不能期望通过它来获取它的值 self.my_method(runner_id) 这是在 MyService class 上调用的(而不是在这个 class 的对象上)。 尝试:

class AbstractImportService

  def initialize(params)
    @init_url = params[:init_url]
  end

  private
  attr_reader :init_url

end

class MyService < AbstractImportService

  def my_instance_method
    "init_url: #{@init_url}"
  end
end

2.2.1 :004 > instance = MyService.new({init_url: "http://www.example.com"})
 => #<MyService:0x007fd5db892250 @init_url="http://www.example.com"> 
2.2.1 :005 > instance.my_instance_method
 => "init_url: http://www.example.com"