2016-09-19 3 views
0

私のシステムにいるユーザは、固有の電子メールを持っている必要があります。既存の電子メールを使用してユーザーを作成しようとすると、コントローラーはエラーをスローし、変更をロールバックします。検証の失敗後にモデルを更新してください

詐欺メールを送信しようとすると、モデルレコードを更新したいと考えています。しかし、ロールバックは、別のレコードにあっても変更が発生することを防止しています。私はupdate_attributeupdate_columnsave(validate: false)を試しましたが、どれもうまくいきません。

ロールバックをバイパスして(別の)モデルを編集するにはどうすればよいですか?

+0

いつ更新したいですか?電子メールが必要/固有であるが、一意性に欠ける場合は、実際に新しいレコードを作成する方法をイメージすることはできません。しかし、私は、既存のレコードを更新するための方法について考えることができます。モデルのエラーオブジェクトを使用して電子メールの検証が失敗したかどうかを確認し、別の要求でモデルを更新することができます。 たとえば、person.errors [:email] 'を使用して、personのemail属性のエラーをチェックし、その人のemail_error属性などが更新されているかどうかを調べることができます。 –

+0

保存(検証:偽)を試しましたか?保存しません(検証:false)。 – YTorii

+0

理想的には、同じ要求で発生します。私は既存のレコードを編集して、新しいレコードを作成しません。ロールバックはリクエスト中に加えられた変更をロールバックするようです。しかし、私はこの時点でどんな解決策にも解決します。 – Dty

答えて

1

私の場合、after_rollbackはトリックを行います。

after_rollbackコールバック中に、電子メールを持っているユーザーがいるかどうかを確認します。もしそうなら、私はロールバックがうまくいっていない電子メールの検証に失敗したと仮定し、適切なレコードを更新します。

+0

before_rollbackコールバックは以前は見たことがありません。きちんとしたコールバックの中でエラーオブジェクト、つまり 'person.errors [:email]'を使用して実際に自分のDBに一致するメールを再度照会するのではなく、実際にその人が偽のメールエラーを持っているかどうかを確認できます実際に差をつけるかどうかは分かりません。 –

+0

私は4年間レールで作業していましたが、初めて見ることになりました。 'person.errors'の良い呼び出しです。間違いなく良いアイデアです。私の場合は元のレコードのメタデータを更新しますが、 'person.errors'のチェックはもっとはっきりしています。 – Dty

0

電子メールの検証にon::createオプションを使用することはどうですか?このオプションを使用すると、検証はcreateでのみ実行され、updateではスキップされます。

validates :email, uniqueness: true, on: :create 
+0

ありがとうございますが、私は十分にはっきりしていないかもしれません。これは私の問題を解決しません。私は妥当性検査の失敗の間に更新をしようとしています。変更は固執していません。 – Dty

関連する問題