[英]Ruby gem extend class with methods defined in a block
我正在创建一个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,但是我无法弄清楚如何使用所需的块语法将两者结合起来用于定义。 有任何想法吗?
您可以创建一个扩展用于捕获参数的哈希的类,然后使用该类执行该块。 完成后,您可以遍历捕获执行的define方法。 这是一个例子:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.