我正在開發一個項目,並且遇到了一個我試圖解決的問題,但沒有取得任何進展。Rails中的驗證衝突
所有這些都發生在我開始執行Forgot Password
功能來重置密碼。我有一個User Model
,它有驗證password
和password_confirmation
。我用這些註冊並正常工作。
但是爲了這個功能,我使用了一個名爲PasswordResets
的新控制器。我爲我的用戶表生成一個名爲password_reset_token
的字符串。並有password_reset_sent_at
它記錄了用戶要求重置的時間。這個過程是這樣的;
1)用戶點擊
Forgot Password
?2)他被重定向到一個頁面,要求他輸入他的電子郵件。
3)控制器檢查電子郵件是否存在於數據庫中,如果是的話;
3.1)我通過使用SecureRandom
生成隨機password_token
,也是他開始請求的時間。
3.2)現在保存發生在這裏發送郵件給用戶。這裏發生問題。password_reset_token
未保存到表中。
背後的原因是,我使用的驗證在User.rb
password
和password _confirmation
。這裏發生的動作是:update
,所以更新記錄是要求password
和password_confirmation
與password_reset_token
一起發送的時間。
但我試圖通過保持驗證爲:on => :create
,現在它運行良好,但當我使用鏈接重置我的驗證將無法工作password
和password_confirmation
。這對我來說就像是一個僵局。我知道這有點混亂,我正在粘貼一些代碼來理解問題。
我PasswordResets Controller
創建動作:
def create
user= User.find_by_email(params[:email])
if user
user.send_password_reset
UserMailer.password_reset(self).deliver
flash[:success] = "Email sent with password reset instructions."
redirect_to root_url
else
flash[:error] = "Email doesn't exit."
render 'password_resets/new'
end
end
我User Model
(user.rb)
class User < ActiveRecord::Base
has_secure_password
EMAIL_REGEX = /\A[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,4}\Z/i
validates_confirmation_of :password_confirmation
validates :username, :presence => true,
:uniqueness => true,
:length => {:within => 8..25}
validates :email, :presence => true,
:uniqueness => true,
:format => EMAIL_REGEX
validates :password, :length => {:within => 8..25}
validates :password_confirmation, :presence => true
def send_password_reset
generate_token(:password_reset_token)
self.password_reset_sent_at = Time.zone.now
save!
UserMailer.password_reset(self).deliver
end
def generate_token(column)
begin
self[column] = SecureRandom.urlsafe_base64
end while User.exists?(column => self[column])
end
end
誤差在send_password_reset
顯示在save!
。我附上了一張圖片。
我知道這個問題可以通過使用:on=>:create
用於驗證爲:update
請求正在進行解決。但是當我在控制檯中得到確認鏈接並使用它時,密碼驗證和password_confirmation不起作用,因爲此處的操作是:update
。這就像一個僵局。
我真的很感謝任何幫助我從這迷宮中走出的人。
謝謝。
非常感謝你Amit!有效 ! – mRbOneS