0

Ich verwende Rails 4.2.5. Ich habe diese SuperklasseIn RoR, wie bekomme ich eine Unterklasse meiner Dienstklasse, um eine Klassenvariable in seiner Superklasse zu erkennen?

class AbstractImportService 

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

    private 

    attr_reader :init_url 

und dann, dass diese Klasse erbt von ihm

class MyService < AbstractImportService 

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

Das Problem ist, die in dem Verfahren „self.my_method“, die Puts Linie druckt „init_url:“ even wenn ich erstmal die @init_url zu etwas mache. Rails hat kein geschütztes Konzept, also gibt es eine andere Möglichkeit, wie ich Unterklassen Klassenvariablen der Superklasse erkennen kann?

Antwort

0

@init_url = params[:init_url] ist eine Instanzvariable, so dass man nicht erwarten kann, um seinen Wert zu erhalten versuchen, es zu erhalten, indem self.my_method(runner_id) , die auf der MyService Klasse aufgerufen wird (und nicht auf einem Objekt dieser Klasse). Versuchen mit:

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" 
+0

ich aus Ihrer Antwort nicht klar bin, was hcanges ich machen muss, damit ich den Wert von „@init_url“ innerhalb der MyService Klasse erkennen kann. Bitte erarbeiten und Code-Beispiele sind immer nützlich. –

+0

Ok, ich werde die obige Antwort bearbeiten und das Codebeispiel hinzufügen. Ist es in Ordnung @Mike? –