2012-04-28 8 views
0

私はレールチュートリアルに従っており、働くユーザーシステムを持っていますが、私には悩ましいものが1つあります。パスワードとパスワードの確認が保存されずに保存されず、同じことが設定されるためです。Railsチュートリアル - バリデーションを無効にしてユーザーを保存する必要があります

これは痛みです。他の重要なバリデーションをユーザーに追加した場合、これは潜在的に危険です。それで、これに対処する良い方法はありますか?実際には、自分のコードからではなく、ユーザーからの更新が行われている場合にのみ検証を適用したいと考えています。

したがって、ユーザーモデルは、このあります

validates :password, length: { minimum: 6 } 
    has_secure_password # this does the hashing, comparisions, etc for us. 
    validates :password_confirmation, presence: true 

これは、ユーザーが作成されたときに素晴らしい作品、それがパスワードを再度入力されていることを必要とするため、ユーザは彼/彼女のプロフィールを編集しているときのために。しかし、他の編集のために、それは迷惑です。例えば:

user = User.find_by_name("bob") 
user.reputation = 200 
user.save(validate: false) # I really don't want to have to care about password validations here. 
+0

あなたのシナリオをもう少し詳しく説明してください。パスワードを作成する前にユーザーを作成しようとしていますか?または、新しいデータが保存されるたびにシステムがパスワードを確認しますか?あるいは私が言及していない他の状況? –

+0

私はこれをより良く説明するために編集しました。 – Jords

答えて

3

あなたはあなたがちょうど作成上の検証を試みることができる

@user.save(:validate => false) 
+0

ありがとう、それは私の質問だった - それは本当の痛みであり、私はユーザーを保存するたびにこれを行う危険性があるようです。 – Jords

+1

データを偶発的に破損する可能性があるので、デフォルトで検証を確認するのは危険です...そして、あなたがしていることを本当に知っていれば、検証をバイパスできます –

+0

私は@Adrianに同意します。パスワードと確認の両方を同じものに設定することは難しくありません。 – EricM

0

を呼び出すことができます。パスワード(または他の変数)は登録時にのみ必要ですが、既存のユーザを編集するときには必要ありません。あなたがのために検証をスキップする属性を介して制御したい場合は

0

は、なぜあなたはそれのために異なるモデルを作成していないが、 &のパスワードを変更するための安全なモデルと、評判、メダル、ものなどを提供する他のもののプロファイルモデルです。最初のモデルに新しい機能を作成する

は少し遅れて相手に

def reputation value 
    self.profile.reputation = value 
    self.profile.save 
end 
0

のように、あなたは完全に二番目のを忘れることができますが、あなたは、単一の属性を更新したい場合は、update_attributeメソッドを使用することができます検証チェックをスキップします。この場合、電話することができます

user.update_attribute :reputation, 200 
関連する問題