首页 > 解决方案 > 为什么我的用户是通过 Rails 控制台创建的,但没有电子邮件属性存储在数据库中?

问题描述

我正在关注 railstutorial.org 上的 Rails 教程。目前我即将完成第6章。当我通过rails控制台创建一个新用户时,该用户是在数据库中创建的,但电子邮件属性设置为nil。当我直接将电子邮件分配给用户时,它在内存中发生了更改,但是当我通过将其保存save在数据库中的方法将其保存时,出现以下错误:

User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND "users"."id" != ? LIMIT

为什么它保存在内存中而不是数据库中?

我尝试使用rails db:migrate. 并删除所有用户,以防有其他用户使用相同的电子邮件(因为邮件的唯一性存在约束或验证规则)。仍然得到同样的错误。

这是schema.rb

ActiveRecord::Schema.define(version: 2019_01_13_035531) do

create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "password_digest"
    t.index ["email"], name: "index_users_on_email", unique: true
end

end

这是用户模型:

class User < ApplicationRecord
    before_save { self.email = email.downcase }
    validates :name, presence: true, length: {maximum: 50} 
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email, presence: true, length: { maximum: 255 },
                      format: { with: VALID_EMAIL_REGEX },
                      uniqueness: { case_sensitive: false }
    has_secure_password
    validates :password, presence: true, length: { minimum: 6 }
end

标签: ruby-on-railssqliterailstutorial.org

解决方案


经过几个小时的阅读,事实证明我只需要rails db:migrate:reset. 它奏效了。显然,仍然有一个非唯一的邮件或什么的。我没有完全理解为什么会发生错误,如果有人可以让我更好地了解 Rails 框架的内部功能,我将不胜感激,因为我也是新手。感谢您的支持。


推荐阅读