2011-01-19 27 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

是的,我知道當一個電子郵件已經存在黽不應該拋出錯誤。它應該簡單地驗證並返回到「此電子郵件已被使用」消息的形式。這種行爲幾乎在所有情況下都會發生,但在少數情況下,rails會驗證已存在的電子郵件,因此它會嘗試保存用戶,並且由於UNIQUE索引,數據庫會引發錯誤。我試圖重新創建它,但即使使用相同的數據,我也能得到正確的行爲而不是錯誤:/ – Draiken 2011-01-19 16:28:05

0

只是猜測,但它可能是你的電子郵件列允許null,validates_uniqueness_of忽略零(或空白)值,並且你的用戶正在嘗試註冊而不指定他們的電子郵件地址?

+0

不,錯誤始終是通過電子郵件傳遞的,但已經存在於數據庫中。我也驗證了電子郵件的存在,所以我不認爲鐵路一次失敗2次驗證 – Draiken 2011-01-19 16:25:10

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 

注意Mysql2Adapter應該MysqlAdapter如果你on Rails的2

在一個側面說明,它是一個長期的bug在Rails中IMO - 在Ruby級別處理大小寫敏感性毫無意義。如果您需要區分大小寫的查找,則應該有utf8_bin的列整理。如果您需要不區分大小寫的查找,則應該有utf8_general_ci的列整理。在where子句中應用BINARY函數將禁用索引,並且validates_uniqueness_of每次嘗試創建/更新記錄時都會導致全表掃描。如果你有數百萬條記錄,你完全搞砸了。上面的補丁也將解決這個問題 - 事實上,這是我創建該補丁的原始動機。

如果你同意,請+1 https://github.com/rails/rails/issues/1399 :)

相關問題