【发布时间】:2015-04-26 08:24:27
【问题描述】:
我正在创建一个应该包装 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
对于每个子类,我希望能够在初始化时根据子属性动态定义一个方法,所以 ListPresenter 就像:
class ListPresenter < BasePresenter
end
应该使用包装的 List 对象的 id 响应 list_id。
如果不在每个子类上定义它,我该怎么做?我在def initialize(object) 中尝试了以下方法,但都不起作用。
如果可能的话,宁愿避免使用基于eval 的方法,因为我听说这是一种代码味道。
类方法(将方法添加到 BasePresenter,而不是子类)
self.class.send(:define_method, "#{object.class.name.underscore}_id") do
@object.id
end
元类方法(无法访问实例变量object 或@object):
class << self
define_method "#{@object.class.name.underscore}_id" do
@object.id
end
end
【问题讨论】:
-
当你说这些不起作用时,会发生什么?
-
@FrederickCheung:添加了对以前方法发生的情况的说明。
-
@fylooi:为什么要在
id前面加上模型名称(即list_id),而不是仅仅将id委托给模型? -
你把这些调用放在哪里定义_method?
-
@Drenmi:不是一个具体的用例,而是按照重新定义模型属性同时保持原始属性可用的思路进行思考。还认为有条件地装饰某些类型的子模型可能会派上用场。 @FrederickCheung:在
def initialize object对象赋值后
标签: ruby-on-rails ruby