【问题标题】:In RoR, how do I get a subclass of my service class to recognize a class variable in its super class?在 RoR 中,如何让我的服务类的子类识别其超类中的类变量?
【发布时间】:2016-11-16 07:28:39
【问题描述】:

我使用的是 Rails 4.2.5。我有这个超类

class AbstractImportService

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

  private

    attr_reader :init_url

然后是继承自它的这个类

class MyService < AbstractImportService

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

问题是,在“self.my_method”方法中,即使我最初将@init_url 指向某个东西,puts 行也会打印出“init_url:”。 Rails 没有受保护的概念,那么有没有其他方法可以让子类识别超类的类成员变量?

【问题讨论】:

    标签: ruby-on-rails-4 inheritance service abstract-class class-variables


    【解决方案1】:

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

    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" 
    

    【讨论】:

    • 从您的回答中我不清楚我需要做什么才能识别 MyService 类中“@init_url”的值。请详细说明,代码示例总是有用的。
    • 好的,我将编辑上面的答案并添加代码示例。 @Mike 你可以吗?
    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2015-07-10
    • 2022-01-05
    • 2016-08-25
    相关资源
    最近更新 更多