ruby-on-rails - Ruby、继承、self.inherited 和 instance_methods()

标签 ruby-on-rails ruby

我正在开发 Rails 应用程序 (3.2.11),并且我正在使用 Ruby 库的服务实现单例服务。我试图避免在每次需要时调用 :instance 方法 (SomethingService.instance.get(some_id)),这样解决了我的问题

class SomethingService
    include Singleton
    class << self
        extend Forwardable
        def_delegators :instance, *ShoppingListService.instance_methods(false)
    end
end

所以这个解决方案工作得很好,但我有很多服务,我不想把这个代码添加到我所有的类中!相反,我试图加入这样的父类(super class):

class ServiceBase
    include Singleton
    def self.inherited(subclass)
        super(subclass) # needed because inherited is override by Singleton

        class << subclass
            extend Forwardable
            def_delegators :instance, *self.instance_methods(false)
        end
    end

end

但是这给我一个stack level too deep错误...有什么想法吗?

最佳答案

在这里使用 method_missing 可能是个更好的主意。 def_delegators 在评估类时执行,甚至可能在您的方法定义之前发生,这仅仅是因为您是从该基类继承的。

您可以改为尝试类似的方法,它将任何未定义的消息转发到实例:

class ServiceBase
  class << self
    def method_missing(name, *args, &block)
      instance.send(name, *args, &block)
    end
  end
end

与委派相比,它可能看起来有点漫不经心。您可以先检查实例方法是否存在,但我认为这不是必需的 - 您只是将未定义的方法处理转移到实例而不是类。

最后一个要点/问题 - 您能详细说明一下您从 Singleton 类中得到了什么好处吗?

关于ruby-on-rails - Ruby、继承、self.inherited 和 instance_methods(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22816611/

相关文章:

ruby-on-rails - 特拉维斯 CI : FATAL: role does not exist

ruby - 您如何处理 SimpleForm 中的单表继承,以便单个助手处理所有模型?

ruby - 与 map 分割!不起作用

ruby-on-rails - 设计自定义 after_update_path_for 不被调用(Rails 4)

ruby-on-rails - rails : elegantly reduce duplication when using json to create objects

ruby-on-rails - 以非线程安全的方式“sass”

sql - 如何在 Rails 4 中构建跨多个表的高效选择命令?

ruby - 如何将编码从 ASCII-8BIT 转换为另一种编码,而不通过 ruby​​ 中的 UTF-8?

ruby-on-rails - 将 LIKE 条件添加到 Rails Conditions block

javascript - Rails 应用程序中最简单的可见计时器