8

新しい Rails アプリケーションの動作を構築するために DCI に従っていますが、バリデーションをどこに置くべきかについて疑問があります。

従来、ActiveRecord モデルを使用してデータを管理する場合、バリデーションは AR から継承する特定のクラスで定義され、データ レイヤーの一部として適切に適合するように見えます。

ただし、私の目には、特定のロールの下でのみ発生する特定の検証を行うことは理にかなっています。オブジェクトがそのコンテキストにある場合にのみチェックし、他のすべての場合は無視する必要があります。これは基本的に、これらの検証を特定の役割で定義する必要があり、オブジェクトが意味のあるコンテキストで使用されている場合は、それらの役割モジュールでオブジェクトを拡張する必要があることを意味します。

これらの検証をロールに保持することは良い考えだと思いますか? もしそうなら、オブジェクトと同じクラスの他のインスタンスを汚染することなく、それらをどのように宣言しますか? ActiveRecord バリデーションを使用したい場合、それらはクラス レベルで宣言されているため、それらをオブジェクトに個別にアタッチすることはできず、ロール モジュールで "validate" インスタンス メソッドの再宣言を使用する必要があります (エラーをオブジェクトのエラー配列に直接)、または同様の手法を使用します。

4

1 に答える 1

5

問題の検証/ルールによって異なります。DCI の主な目標は、ルールがドメイン モデルに関連付けられている場合に、システムが何であるか (ドメイン モデル) をシステムが行うこと (機能) から分離することです。たとえば、SSN のウェルフォームのルールは、データ オブジェクトの一部である必要があります。一方、ルールがシステムの機能に関連している場合、たとえば、ユーザーは毎週 2 つの超割引商品しか注文できないなど、コンテキストの問題です。

于 2012-10-23T10:47:47.530 に答える