【问题标题】:Ruby on Rails - User object showing nil fields even though they are filledRuby on Rails - 显示 nil 字段的用户对象,即使它们已填充
【发布时间】:2016-12-20 16:50:30
【问题描述】:

让我的用户注册在 Rails 中工作时遇到了一个奇怪的问题。当我创建一个用户时,它会显示它的所有字段,但 password_digest 为零,但是当我输入“u.email”之类的内容时,电子邮件就会显示出来。但是,我认为它不想保存用户,因为它认为它不满足所有验证要求。

一些rails控制台摆弄:

irb(main):003:0> u = User.new({username: "askddkasd", email: "a@a.a", 
    password: "meowmeowmeow", password_confirmation: "meowmeowmeow"})
=> #<User id: nil, username: nil, email: nil, password_digest: 
    "$2a$10$eWhQdOCLXfmcGrrRdigSFeENUeAEaQ6xJ7U08k7g3gZ...", salt: nil>
irb(main):002:0> u.save
    (0.2ms)  BEGIN
      User Exists (0.3ms)  SELECT  1 AS one FROM `users` WHERE `users`.`username` = BINARY 'askddkasd' LIMIT 1
      User Exists (0.2ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY 'a@a.a' LIMIT 1
    (0.1ms)  ROLLBACK
=> false
irb(main):022:0> u.username
=> "askddkasd"
irb(main):023:0> u.email
=> "a@a.a"

如您所见,这些字段显示为 nil,但我可以访问它们的值。 这是我的用户模型:

class User < ApplicationRecord
    has_secure_password

    attr_accessor :username, :email, :password, :password_confirmation

    validates :username, :presence => true, :uniqueness => true, :length => { :in => 3..20 }
    validates :email, :presence => true, :uniqueness => true
    validates :password, :confirmation => true #password_confirmation attr
    validates_length_of :password, :in => 6..20, :on => :create

    after_save :clear_password

    def password=(password)
        self.password_digest = BCrypt::Password.create(password)
    end

    def is_password?(password)
        BCrypt::Password.new(self.password_digest) == password
    end

    def clear_password
        self.password = nil
    end

    def self.authenticate(username_or_email="", login_password="")
      if username_or_email.include? '@'
        user = User.find_by_email(username_or_email)
      else
        user = User.find_by_username(username_or_email)
      end

      if user && user.is_password?(login_password)
        return user
      end
      return false
    end
end

以前有人遇到过这个问题吗?如果是这样,您是如何解决的?

更新:可能是因为我有用户名和电子邮件作为访问者吗?所以这些值实际上并没有到达要存储在数据库中的用户名/电子邮件字段?

【问题讨论】:

  • u.errors 中有什么内容?
  • #&lt;ActiveModel::Errors:0x007fa075241e50 @base=#&lt;User id: nil, username: nil, email: nil, password_digest: "$2a$10$WH5OUfqx4vYDoeD3nMlhR.rm9F7O6QSIg.Rd9zcu215...", salt: nil&gt;, @messages={:password_confirmation=&gt;["doesn't match Password"], :password=&gt;["is too short (minimum is 6 characters)"]}, @details={:password_confirmation=&gt;[{:error=&gt;:confirmation, :attribute=&gt;"Password"}], :password=&gt;[{:error=&gt;:too_short, :count=&gt;6}]}&gt;

标签: ruby-on-rails ruby model-view-controller login model


【解决方案1】:

日志中这条语句后回滚的事实

User Exists (0.2ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY 'a@a.a' LIMIT 1

让我觉得数据库中已经有一个用户使用此电子邮件地址。您可以通过调用u.valid? 然后u.errors 确定问题所在。

【讨论】:

  • 用户表中有 0 个条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2015-06-08
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多