【问题标题】:Ruby gem extend class with methods defined in a blockRuby gem 使用块中定义的方法扩展类
【发布时间】:2011-09-27 23:05:04
【问题描述】:

我正在创建一个 gem,并希望能够通过为序列化属性动态创建属性 getter 和 setter 来修改 ActiveRecord 对象。例如:

class User
  has_serialized :setting do |config|
    config.define :notify_by_email, default: true
    config.define :notify_by_phone, default: true
  end
end

user = User.new
user.notify_by_email? # true
user.notify.by_phone? # true
user.notify_by_email = false
user.notify_by_phone = false
user.notify_by_email? # false
user.notify.by_phone? # false

我意识到我需要使用包含方法 has_serialized 的模块来扩展 ActiveRecord,并且我需要使用 define_method 来添加自定义 getter 和 setter,但是我不知道如何组合两个使用我想要定义的块语法。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby gem


    【解决方案1】:

    您可以创建一个扩展用于捕获参数的哈希的类,然后使用该类执行块。完成后,您可以迭代您的捕获执行定义方法。这是一个例子:

    class Initializer < Hash
      def define(settings, options = {})
        self[setting] = options
      end
    end
    
    module ClassMethods
      def has_serialized(name, &block)
        initializer = Initializer.new
        block.call(initializer)
        initializer.each do |method, options|
          define_method "#{method}?" do
            ...
          end
          define_method "#{method}=" do |value|
            ...
          end
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-20
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多