3

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

4

1 に答える 1

0

これがうまくいくかどうかはわかりません。しかし、なぜサブクラスを作成しないのでしょうか?

ここで必要なものを正しく理解していれば、コードと使用法がよりクリーンになると思います。

#artist.rb
class Artist < ActiveRecord::Base
end

#artist_with_validations.rb
class ArtistWithValidations < Artist
  before_validation :validate_facebook_name

  def validate_facebook_name
    # Contact Facebook API
  end
end

次に、検証の有無にかかわらずユーザーが必要かどうかに応じて、2 つのモデルのいずれかを使用できます。

于 2013-10-02T10:16:46.997 に答える