15

emailやhashed_pa​​sswordなどの通常の属性を持つUserモデルがあります。Eメールアドレスの存在をチェックする検証を作成したいのですが、

1)このオブジェクトのデータベースに保存されているものがありません(つまり、これは新規ユーザーのサインアップです)

2)ユーザーが自分のメールアドレスを更新しようとしています。

私の現在の検証

  validates_presence_of :email
  validates_presence_of :email_confirmation

  validates_confirmation_of :email

明らかに私が属性を更新するのを妨げています。使ってみようと思いました

validates_presence_of:email、:if:email_validation_required?

def email_validation_required?
self.email.blank?
end

ただし、シナリオ2では、ユーザーがデータベースにパスワードの電子メールアドレスを持っているため、trueが返されるため、これは役に立ちません。

上記の2つのシナリオだけに制限する方法を理解できません。

誰か助けてもらえますか?

4

3 に答える 3

24

EmFiは何かに取り組んでいると思います。validates_presence_of :emailしかし、私はあなたを抑えているべきではないと思います。はemail常に存在する必要があります。フォームで空白のままにすると、パラメーターがユーザーの保存に影響を与えることはありません。それがフォームに入力された場合、更新のためであっても、それはemail_confirmation乗り心地に沿っている必要があります。

これを試してみてください:

validates_presence_of :email
validates_presence_of :email_confirmation, :if => :email_changed?

validates_confirmation_of :email
于 2009-11-05T15:00:41.620 に答える
10

2つのオプションがあります。1つはを使用すること:onです。デフォルトでは、に設定されて:on => :saveいますが、次のようなことができます

validates_presence_of :email, :on => :create

また

validates_presence_of :email, :on => :update

他のオプションは、を使用してから:if、メソッド名またはプロシージャを渡すことです。だから何かのような

validates_presence_of :email, :if => :should_validate

また

validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 }

お役に立てば幸いです:)

于 2009-11-04T13:51:49.613 に答える
5

ActiveRecord :: Dirtyメソッドを使用する検証で:if句を使用するとします。

validates_presence_of :email, :if => Proc.new { |user| user.email_changed?}

注意:Rails2.1以降でのみ機能します。

于 2009-11-04T15:44:16.867 に答える