在 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"
我正在使用 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"