【问题标题】:Ruby on rails validation bugRuby on rails 验证错误
【发布时间】:2015-05-18 09:40:29
【问题描述】:

对于某些在注册 validate_uniqueness_of 时不起作用,即使它在运行控制台时起作用

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

请告诉我运行它的网站我做错了什么:

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

【问题讨论】:

    标签: ruby-on-rails validation data-modeling


    【解决方案1】:

    除了身份验证系统和密码学很难正确处理这一事实之外,您的错误也很简单。

    在选择是否重定向到成功页面或呈现错误消息时,您正在测试user 的真实性。但是,正如您的控制台测试所示,如果验证失败,您的 create_with_password 将返回非 nil 用户。该用户无效并且未保存在数据库中,但这不是您的控制器正在测试的内容。

    您可以检查user.valid?,而不是检查user 是否真实

    【讨论】:

      【解决方案2】:

      您可以使用Save! 来确保验证是否失败。事务将回滚

      【讨论】:

        【解决方案3】:

        首先,使用Devise

        让您的控制器创建一个实例、设置属性并保存。您的验证将起作用。请参阅ActionController Overview 导轨。

        【讨论】:

        • 谢谢:请检查设计
        • 创建不仅仅是为了关系。还保存和保存!两者都运行验证 - 如果验证表明记录无效,它们的作用只是不同。
        • 关于savesave! 是正确的,第二个在验证失败时抛出异常。除了关联之外,我没有找到 ActiveRecord 的任何 create 方法。答案引用了“rails way”。
        • 好吧,保存还是保存!与创建无论如何都与答案的要点无关;所以,我把它煮沸了。
        猜你喜欢
        • 1970-01-01
        • 2018-04-27
        • 2018-03-02
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 2012-04-29
        • 2022-01-26
        • 1970-01-01
        相关资源
        最近更新 更多