簡體   English   中英

Ruby gem擴展類具有在塊中定義的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM