小编fyl*_*ooi的帖子

Ruby 元编程:基于子实例属性动态定义方法

我正在创建一个演示者基类,它应该包装一个 ActiveRecord 对象。

class BasePresenter
  def initialize object
    @object = object
  end

  def method_missing(*args, &block)
    @object.send(*args, &block)
  end

  def self.wrap collection
    collection.map { |item| new item }
  end
end
Run Code Online (Sandbox Code Playgroud)

对于每个子类,我希望能够在初始化时根据子属性动态定义一个方法,因此 ListPresenter 如下所示:

class ListPresenter < BasePresenter
end
Run Code Online (Sandbox Code Playgroud)

应该list_id使用包装的 List 对象的 id 进行响应。

如果没有在每个子类上定义它,我该怎么做?我在 中尝试了以下方法def initialize(object),但都不起作用。eval如果可能的话,我宁愿避免基于方法,因为我听说这是一种代码气味。

类方法(将方法添加到 BasePresenter,而不是子类)

self.class.send(:define_method, "#{object.class.name.underscore}_id") do
  @object.id
end
Run Code Online (Sandbox Code Playgroud)

元类方法(无法访问实例变量object@object):

class << self
  define_method "#{@object.class.name.underscore}_id" do
    @object.id
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails

5
推荐指数
1
解决办法
1166
查看次数

标签 统计

ruby ×1

ruby-on-rails ×1