我们的 ActiveRecord 模型有许多不幸地使用网络的验证。例如,它使用 Facebook API 来验证给定的 Facebook ID 属性。我想将这些验证移出模型,以便它们仅在特定上下文中运行,而不是在 Factory Girl 在测试中创建时运行。它还需要以与 ActiveAdmin 兼容的方式完成。
我的想法是将方法提取到模块中,并让该模块适当地扩展 AR 实例。
module ArtistConnectionValidations
def self.inject_to(record)
record.extend self
record.class_eval do
before_validation :validate_facebook_name
end
end
def validate_facebook_name
# Contact Facebook API
end
end
在使用继承资源的 ActiveAdmin 中:
controller do # Executes in controller context
def resource
ArtistConnectionValidations.inject_to(Artist.find(params[:id]))
end
end
不幸的是,这些验证不会被调用,因为它们被添加到实例的单例类中,并且#valid?
方法回调看不到它们。各种其他策略导致它被添加到基类中,从而感染整个系统。有任何想法吗?