gpt4 book ai didi

ruby-on-rails - 如何在插件的 before_save 回调中包含实例方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:28 24 4
gpt4 key购买 nike

我正在创建一个插件,但很难定义调用我刚刚定义的实例方法的 before_save 过滤器。这是一个快速示例:

module ValidatesAndFormatsPhones
def self.included(base)
base.send :extend, ClassMethods
end

module ClassMethods

def validates_and_formats_phones(field_names = [:phone])
send :include, InstanceMethods

# the following variations on calls to :format_phone_fields fail

before_save send(:format_phone_fields, field_names)

before_save format_phone_fields(field_names)

before_save lambda { send(:format_phone_fields, field_names) }

# EACH OF THE ABOVE RETURNS 'undefined_method :format_phone_fields'
end
end

module InstanceMethods

def format_phone_fields(fields = [:phone], *args)
do stuff...
end

end
end

ActiveRecord::Base.send :include, ValidatesAndFormatsPhones

我想问题是,如何将上下文更改为实例而不是类?

我更喜欢调用实例方法,因为该类实际上不应该有一个名为“format_phone_fields”的方法,但实例应该有。

谢谢!

最佳答案

在适当的时候包含您的方法:当您扩展基类时:

module ValidatesAndFormatsPhones
def self.included(base)
base.send :extend, ClassMethods
base.send :include, InstanceMethods
end

module ClassMethods
def validates_and_formats_phones(field_names = [:phone])
before_save {|r| r.format_phone_fields(field_names)}
end
end

module InstanceMethods
def format_phone_fields(fields = [:phone], *args)
# do stuff...
end
end
end

ActiveRecord::Base.send :include, ValidatesAndFormatsPhones

我还没有运行代码,但它应该可以工作。我经常做类似的事情。

关于ruby-on-rails - 如何在插件的 before_save 回调中包含实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2164773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com