2015-05-09 122 views
0

對於一些註冊validate_uniqueness_of無法正常工作,即使它運行控制檯Ruby on Rails的驗證錯誤

2.1.5 :001 > User.create_with_password('rajiv', 'abc') 
    (0.1ms) begin transaction 
    User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE "users"."username" = 'rajiv' LIMIT 1 
    (0.2ms) rollback transaction 
=> #<User id: nil, username: "rajiv", salt: "ddda20c52e698f6e5623d7e782e2cd19", password_hash: "565b91a38e2acc41887e3936fe660b68245b3f1d8118f38bbc..."> 
2.1.5 :002 > 

def register 
    @username = params[:Username] 
    @password = params[:password] 
    @rePassword = params[:rePassword] 
    user = User.create_with_password(@username, @password) 
     if user 
     session[:signed_in] = true 
     session[:username] = user.username 
     flash[:notice] = "User successfully created you can sign in now" 
     redirect_to '/Sign_up' 
     else 
     flash[:notice] = "User already exists" 
end 

請告訴我什麼時候工作什麼我做錯了網站IM上運行它時是:

https://ipt-dynaman.c9.io/Sign_up

這裏是我的模型代碼:

class User < ActiveRecord::Base 
    validates_presence_of :username, :salt, :password_hash 
    validates_uniqueness_of :username 

    def self.create_with_password(username, password) 
     salt = SecureRandom.hex 
     password_hash = self.generate_hash(password, salt) 

     self.create(
     username: username, 
     salt: salt, 
     password_hash: password_hash 
     ) 
    end 

    def verify_password(password) 
     self.password_hash == User.generate_hash(password, self.salt) 
    end 

    def self.generate_hash(password, salt) 
     digest = OpenSSL::Digest::SHA256.new 
     digest.update(password) 
     digest.update(salt) 
     digest.to_s 
    end 
end 

回答

0

首先,使用Devise

讓您的控制器創建實例,設置屬性並保存。您的驗證將起作用。請參閱 Rails指南中的ActionController Overview

+0

感謝:D病檢查設計 – dynaman

+0

創建不僅僅是關係。還保存並保存!兩者都運行驗證 - 如果驗證說該記錄是無效的,它們只會有所不同。 –

+0

真的關於'save'和'save!'第二個在驗證失敗時拋出異常。除了關聯以外,我沒有找到任何ActiveRecord的「創建」方法。答案引用了'鐵軌方式'。 –

0

除了認證系統和密碼技術難以正確使用這個事實之外,你的錯誤很簡單。

當選擇是否重定向到成功頁面或呈現錯誤消息時,您正在測試user的真實性。但是,如您的控制檯測試顯示,如果驗證失敗,您的create_with_password將返回非零用戶。該用戶無效並且未保存在數據庫中,但這不是您的控制器正在測試的內容。

不是檢查是否user的是truthy,你可以改爲檢查user.valid?

0

可以使用Save!以確保如果驗證失敗。交易將回滾