2015-05-09 110 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!以确保如果验证失败。交易将回滚