私たちの 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?
メソッド コールバックはそれらを認識しません。他のさまざまな戦略により、基本クラスに追加され、システム全体に感染します。何か案は?