0

この問題への最善の対処方法がわかりません。新しいレコードを追加するときにユーザーのパスワードを検証する必要があり、パスワードを更新するときにも検証できる必要があります。しかし、ユーザーが自分のプロファイルの一部だけを更新し、おそらくパスワードを空白のままにするにはどうすればよいでしょうか。

allow_blank を提案する前に注意してください。私はこのオプションを認識していますが、ユーザーがパスワードを紛失/忘れたためにパスワードを変更する必要がある場合、ユーザーに空白のパスワードを許可したくないため、これは適切ではありません。

4

3 に答える 3

1

if ステートメントを検証に渡すことができます。

`validates_presence_of :password, :if => :should_validate_password?

ここで条件を渡して、ユーザーがパスワードを更新しているかどうかをキャッチできるはずです。

モデル

def should_validate_password?
  updating_password || new_record?
end

コントローラ

@user.updating_password = true
@user.save

詳細については、こちらを参照してください: http://railscasts.com/episodes/41-conditional-validations

更新しました:

あなたの場合、新しいパスワードがパラメーターに渡されているかどうかを検出する if ステートメントをコントローラーに作成します。もしそうなら@user.updating_password = true、モデルで検証をトリガーするものを設定します。そうでない場合は@user.updating_passwordnil になり、検証はトリガーされません。

于 2013-09-26T08:35:12.410 に答える
1

フルカスタム方法

通常、#password=および#password_confirmation=単なる仮想セッターであり、真の属性は #hashed_passwordまたは何かです。したがって、次のようなことができます。

class User
  attr_accessor :password, :password_confirmation

  validate :validates_password
  validates_presence_of :hashed_password

  private

  def validates_password
    if password or password_confirmation
      if password != password_confirmation
        errors.add( :password, 'your message' )
      end
      # your others validations

      self.hashed_password = hash_password
    end
  end

  def hash_password
    # your hashing code
  end
end

ユーザーがパスワードを提供して作成されるpasswordと、仮想属性password_confirmationが設定されるため、if条件が true になり、検証が適用されます。

パスワードがすでに設定されていて、ユーザーがそれを変更しない場合 (パスワードを提供しない編集フォーム)、検証は強制されませんif password and password_confirmation

パスワードがすでに設定されていて、ユーザーがそれを変更してpassword設定するとpassword_confirmation、検証がトリガーされます。

パスワードをリセットしたい場合は、アクションhashed_passwordに nil を設定するだけです。モデルは現在無効でありvalidates_presence_of :hashed_password、ユーザーは新しいモデルを提供する必要があります。

#has_secure_password の使用

を使用#has_secure_passwordすると、レールはこれらのほとんどを処理します。特に:

  • 仮想属性を作成します
  • パスワード属性が提供されている場合にのみ、確認一致の検証をトリガーします
  • パスワードをハッシュします

したがって、必要なのは独自の検証を追加することだけであり、存在する場合にのみ実行しpasswordますpassword_confirmation

class User
  has_secure_password
  validate :validates_password

  private

  def validates_password
    if password or password_confirmation
      unless <your_test>
        errors.add( :password, '<your error message>' )
      end
    end
  end
end

以前と同様に、これは password と password_confirmation が提供された場合にのみトリガーされます。これは、ユーザーがそれらをフォーム データとして送信した場合にのみ発生します (実際の属性は ですpassword_digest)。

于 2013-09-26T08:46:14.147 に答える