0

我正在開發一個項目,並且遇到了一個我試圖解決的問題,但沒有取得任何進展。Rails中的驗證衝突

所有這些都發生在我開始執行Forgot Password功能來重置密碼。我有一個User Model,它有驗證passwordpassword_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.rbpasswordpassword _confirmation。這裏發生的動作是:update,所以更新記錄是要求passwordpassword_confirmationpassword_reset_token一起發送的時間。

但我試圖通過保持驗證爲:on => :create,現在它運行良好,但當我使用鏈接重置我的驗證將無法工作passwordpassword_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!。我附上了一張圖片。

enter image description here

我知道這個問題可以通過使用:on=>:create用於驗證爲:update請求正在進行解決。但是當我在控制檯中得到確認鏈接並使用它時,密碼驗證和password_confirmation不起作用,因爲此處的操作是:update。這就像一個僵局。

我真的很感謝任何幫助我從這迷宮中走出的人。

謝謝。

回答

1

您可以跳過驗證使用以下例如。

def send_password_reset 
    generate_token(:password_reset_token) 
    self.password_reset_sent_at = Time.zone.now 
    self.save(validate: false) 
    UserMailer.password_reset(self).deliver 
end 
+0

非常感謝你Amit!有效 ! – mRbOneS