2013-06-20 123 views
2

我正在使用設計來管理我的應用程序的用戶帳戶。到目前爲止,一切工作都很順利,但我偶然發現了我發現的非常奇怪的行爲。基本上發生的事情是,我下面的代碼添加到我的用戶模型:密碼驗證中斷設計確認

validates :password, { confirmation: true, length: { in: 6..20 } } 
validates :username, { uniqueness: true, length: { in: 3..25 } } 

乍一看這似乎很好地工作。未能輸入有效信息會使用戶信息不能保存到數據庫中。不幸的是,它以某種方式破壞了設計的電子郵件確認。設計仍然在註冊時發送電子郵件,但確認鏈接不像以前那樣工作。突然間發生了什麼事情,他發送我到頁面,我可以重新請求確認信息(儘管沒有被告知這樣做)。他還抱怨(通過閃光消息)我的密碼不能「空白」,並且用戶未被保存。這是毫無意義的,因爲在確認鏈接被點擊之前用戶已經被保存了(也有一個有效的密碼)。而且它實際上得到保存,因爲我發現手動檢查數據庫表。

我從這裏收集到的是他可能試圖更改用戶表中的某些列,如confirmed_email和confirmed_at等。但不知何故,他也嘗試在同一時間提供新的pw,這絕對不是他應該正在做。爲什麼他將我重定向到可以重新發送確認郵件的頁面,這完全超出了我的想象。

我能做些什麼來解決我的問題?我不想使用:validatable,而是做我自己的驗證,而不會完全破壞我的設計。下面是一些額外的信息:

軌3.2.12
紅寶石1.9.3p392 色器件2.2.3

日誌:

入門使用 「/用戶/確認confirmation_token = ojx35QawQdHSWi655mru?」 爲127.0。 0.1在2013-06-20 17:01:12 +0200 處理由Devise :: ConfirmationsController#顯示爲HTML 參數:{「confirmation_token」=>「ojx35QawQdHSWi655mru」} 用戶負載(0.3ms)SELECT「users」。 * FROM「users」WHERE「users」。「confirmation_token」='ojx35QawQdHSWi655mru'LIMIT 1 (0.1ms)BEGIN User Exists(0.2ms)SELECT 1 AS one FROM「users」WHERE(「users」。「username」='what heck'AND「users」。「id」!= 22)LIMIT 1 (2.1ms) (0.1ms)ROLLBACK 渲染設計/共享/ _links.erb(0.4ms) 佈局/應用程序中渲染設計/確認/ new.html.erb(2.1ms) 已完成200在14ms內完成(Views:9.0ms | ActiveRecord的:爲0.8ms)

回答

7

它可能不是你的問題,但設計已經驗證你的密碼

config/initializers/devise.rb

config.password_length = 8..128

嘗試改變這不是增加它首先到用戶模型。 (或將其刪除)

+0

對我來說這條線是用相同的號碼活躍,但我仍然可以使用2個報名符號長度密碼。有人知道爲什麼 – Gediminas

+2

取消註釋後,您是否重新啓動服務器? – lilwupster

+0

是的。對我來說,它只在將驗證規則添加到模型中時纔有效... – Gediminas

0

編輯此線在devise.rb

config.password_length = 6..20 

這上面的行被內置在devise.The密碼長度的結構被設置爲8至128中orignal.The設計用戶不需要編寫關於用戶認證的自定義驗證器。對於例如,對於電子郵件格式,我們可以設置

config.email_regexp = /\A[^@][email protected][^@]+\z/ 
+1

單行答案很難接受。嘗試編輯和解釋*爲什麼*這個答案是正確的,以幫助OP學習。 – codeMagic

0

忘了條目application_controller.rb在軌道4,5

before_action :configure_permitted_parameters, if: :devise_controller? protected 
def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up {|u|u.permit(:email,:password,:password_confirmation)} 
end