在演示者中重用方法的常规方法是什么?

时间:2017-01-15 05:19:18

标签: ruby-on-rails

在演示者之间重用方法的惯例是什么?

例如,假设某个应用有以下演示者

avatar

用户和管理员都有头像。在User和Admin演示者之间共享class UserPresenter < AvatarPresenter end class AdminPresenter < AvatarPresenter end class EventPresenter < BasePresenter end class AvatarPresenter < BasePresenter end 方法的正确方法是什么?

一种解决方案可能是从AvatarPresenter继承

method not found

在这个简单的例子中,哪个有效。但是如果将来事情变得更加复杂(例如,管理员和事件之间共享的其他方法)会怎样。

我想我想分享主持人之间的担忧。这是一种传统方法,如果是这样,模板实现会是什么样子?我的所有尝试都会引发kallsyms错误。

1 个答案:

答案 0 :(得分:5)

您要找的是traits。在Ruby中,它采用模块mixins的形式。

module Avatar
  def self.included(base)
    base.extend ClassMethods
    base.class_eval do
      # in this block you are operating on the singleton class
      # where the module is included
    end
  end

  def an_instance_method_from_avatar
  end

  module ClassMethods
    def a_class_method_from_avatar
    end
  end
end

class UserPresenter
  include Avatar
end

class AdminPresenter
  include Avatar
end

这使我们可以创建可以以多种不同方式组合的可重用组件。 ActiveSupport::Concern采用上述模式并简化它:

module Avatar
  # modules can be extended by other modules
  extend ActiveSupport::Concern

  included do
    # in this block you are operating on the singleton class
    # where the module is included
  end

  class_methods do
    def a_class_method_from_avatar
    end
  end

  def an_instance_method_from_avatar
  end
end
另一方面,如果对象是其父对象的真实子类型,则应该真正使用

继承(基于类)。虽然你可以说AdminPresenter是一个带有头像的演示者,如果你需要添加其他功能,这将导致一个非常复杂的类图。