2011-01-19 4 views
0

私はウェブサイトでrails 2.3.5とAuthlogicを使用しています。私は、複製された電子メールを保存しようとしているユーザーのhoptoadによってデータベースにエラーが発生しています。問題は明らかに、モデルにvalidates_uniqueness_of :emailがあることです。validates_uniqueness_ofの問題

ここでのテストでは、予想される検証エラーが発生し、ユーザーは保存されませんが、本番ではこのエラーがDBレイヤーで発生し続けます。

私は大文字と小文字を区別する電子メールでテストし、正しく検証しました。

私がチェックし、クラスと全くattr_accessorまたは他の属性のオーバーライドが存在しない、と私は本番で何が起こって何ができるか... Authlogicは間違った方法でそれを行うだろう

思いませんか?しましたかレールの検証がうまくいかない場合はありますか?

答えて

0

シナリオを再作成しましたか。 Hoptoad通知を正当なものとするエラーをなぜ投げなければならないのですか?つまり、基本的には、ユーザーを保存してはならず、hoptoadがあなたに通知するためのエラーを投げてはいけません。

また、authlogicでは、メールのvalidate_uniqueness_ofを指定する必要はありません。通常、authlogicがそれを処理します。

だから、深いダイビングをする時間があると思います。

ログを確認し、このエラーをローカルで再作成してください。常にエラーにつながるステップを辿るのが最良です。

さらに詳しい情報、エラースタック、コードは間違いなく役立つでしょう。

+0

はい、私は電子メールがすでに存在しているときhoptoadがエラーをスローしてはいけません知っています。それは、単に「この電子メールはすでに使用中です」というメッセージとともに、検証してフォームに戻るべきです。ほとんどの場合、その動作は起こっていますが、レールがすでに存在する電子メールを検証しているため、ユーザーを保存しようとします。そのため、データベースはUNIQUEインデックスのためにエラーをスローします。私はそれを再作成しようとしていますが、同じデータであっても、エラーの代わりに正しい動作をします。/ – Draiken

0

電子メール列がnullを許可する可能性がありますが、validates_uniqueness_ofはnil(または空白)値を無視しており、ユーザーは電子メールアドレスを指定せずに登録しようとしている可能性がありますか?

+0

いいえ、エラーは常に電子メールが渡されているのにデータベースに既に存在しています。私も電子メールの存在を検証しているので、2回の検証でレールが一度に失敗しているとは思わない。 – Draiken

+0

それでは、あまりにも多くのアイデアがある。運用アプリのエラーログレベルを変更して、実行中のクエリを表示することをおすすめします。大文字小文字の区別の問題か、後続のスペースに関連する可能性があると思いますか? – noodl

1

は、開発ログにvalidates_uniqueness_ofを実行しているSQLを見つけて、あなたがWHERE (email = BINARY '[email protected]')のようなものを見たら、[email protected]でユーザーを作成しようとすると、今、あなたは、DB-レベルの重複例外を再現することができます。 config/initializers/patches.rbに次のコードを入れて、この問題を解決するには

class ActiveRecord::ConnectionAdapters::Mysql2Adapter 
    def case_sensitive_equality_operator 
    "=" 
    end 
end 

(注)サイドノートではRailsの2.

にしている場合Mysql2AdapterMysqlAdapterでなければならないこと、それは長年のバグですRubyレベルで大文字と小文字を区別するIMOはまったく意味がありません。大文字と小文字を区別する必要がある場合は、列の照合順序をutf8_binに設定する必要があります。大文字小文字を区別しない検索が必要な場合は、列の照合順序をutf8_general_ciにする必要があります。 where句にBINARY関数を適用すると、インデックスの使用が無効になります。validates_uniqueness_ofは、レコードを作成/更新しようとするたびにフルテーブルスキャンを実行します。何百万というレコードがあれば、あなたは完全に戸惑います。上記のパッチも修正されます - 実際、そのパッチを作成するのは私の最初の動機でした。

同意する場合は、してください1 https://github.com/rails/rails/issues/1399に:)

関連する問題