40

私は Rails にまったく慣れていないので、プレゼンスと一意性を段階的に検証する小さなスニペットを見つけました。最初にプレゼンスを確認し、次に一意性を確認します。

validates :email, :presence => true, :allow_blank => true, :uniqueness => { :case_sensitive => false }

presence => trueと をallow_blank => true一緒に使用することについて少し混乱しています。

両方のルールを使用しallow_blank => trueないと、段階的ではなく同時にチェックされます。

なぜallow_blank => trueこの魔法をするのですか?

4

5 に答える 5

36

あなたが持っているものはこれと同等です(わかりやすくするためにラップされています):

validates :email, :presence => true, 
            :uniqueness => { :allow_blank => true, :case_sensitive => false }

:allow_blankただし、プレゼンスが必要な場合は、句を「無効にする」ことになるため、少しばかげています:uniqueness

他のバリデーターを使用するように切り替えると、より理にかなっています..言う...formatuniqueness、しかし、空白の場合はチェックしたくありません。この場合、「グローバルに適用される」を追加:allow_blankする方が理にかなっており、コードを少し DRY します。

これ...

validates :email, :format => {:allow_blank => true, ...}, 
                  :uniqueness => {:allow_blank => true, ...}

次のように書くことができます:

validates :email, :allow_blank => true, :format => {...}, :uniqueness => {...}
于 2013-01-23T21:53:03.637 に答える
30

次の違いを知っておくと役立ちます。

presence: true                    # nil and empty string fail validation
presence: true, allow_blank: true # nil fails validation, empty string passes
于 2014-09-30T16:11:14.323 に答える
7

:allow_blankいくつかのバリデータを「無効」にするオプションですが、プレゼンスバリデータは無効にしません。これら 2 つを一緒に使用した結果、フィールドを空白のままにすると、:blankエラー メッセージ (つまり、「空白にすることはできません」) が表示されますが、他のエラー メッセージは表示されません。

于 2013-09-19T20:15:18.823 に答える