Rails 5:ActiveRecord没有创建记录

时间:2016-10-21 01:43:56

标签: ruby-on-rails ruby activerecord ruby-on-rails-5

我正在研究Michael Hartl的Learn Rails教程的修改版本。我在第6章,为用户建模。出于某种原因,我的用户无法在ActiveRecord上正确创建,并且根本没有保存。

我将这些用户放在我的seeds.rb文件

user_1 = User.create(id: 1, name: 'Han Solo', email: 'han@example.com')
user_2 = User.create(id: 2, name: 'Luke Skywalker', email: 'luke@example.com')

然后我运行rails db:seed,但如果我转到我的rails console,则似乎没有创建用户:

Running via Spring preloader in process 24358
Loading development environment (Rails 5.0.0.1)
2.2.2 :001 > User.delete_all
  SQL (1.1ms)  DELETE FROM "users"
 => 0 
2.2.2 :002 > 

user.rb用户模型

class User < ApplicationRecord
    #Ensure Email Uniqueness by Downcasing the Email Attribute
    before_save {self.email = email.downcase }
    #validates name, presence, and length
    validates :name, presence: true, length: { maximum: 100 }
    #Validate presence, length, format, and uniqueness (ignoring case)
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email, presence: true, length: {maximum: 250}, format: {with: VALID_EMAIL_REGEX }, uniqueness: {case_sensitive: false}
    #Adds ability to save securely hashed password_digest attribute to database
    #Adds a pair of virtual attributes (password and password_confirmation)
    #including presence validations upon object creation and a validation
    #requiring that they match
    #adds authenticate method that returns the user when the password is correct (and false otherwise)
    has_secure_password
    PASSWORD_FORMAT = /\A
        (?=.{8,})          # Must contain 8 or more characters
        (?=.*\d)           # Must contain a digit
        (?=.*[a-z])        # Must contain a lower case character
        (?=.*[A-Z])        # Must contain an upper case character
        (?=.*[[:^alnum:]]) # Must contain a symbol
    /x
    validates :password, presence: true, length: {minimum: 8}, format: {with: PASSWORD_FORMAT}

end

schema.rb

ActiveRecord::Schema.define(version: 20161020211218) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  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, using: :btree
  end

end

任何人都知道可能会发生什么?

1 个答案:

答案 0 :(得分:1)

好的,我明白了。

  1. 我从种子中取出了id .rb。当我拿出id属性时,它开始向我抛出用户没有有效密码的错误。然后我添加了密码和密码确认,以符合我的用户模型中设置的密码标准。
  2. 更新了我的模型并添加了密码确认。
  3. 这是我更新的user.rb

    class User < ApplicationRecord
        #Ensure Email Uniqueness by Downcasing the Email Attribute
        before_save {self.email = email.downcase }
        #validates name, presence, and length
        validates :name, presence: true, length: { maximum: 100 }
        #Validate presence, length, format, and uniqueness (ignoring case)
        VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
        validates :email, presence: true, length: {maximum: 250}, format: {with: VALID_EMAIL_REGEX }, uniqueness: {case_sensitive: false}
        #Adds ability to save securely hashed password_digest attribute to database
        #Adds a pair of virtual attributes (password and password_confirmation)
        #including presence validations upon object creation and a validation
        #requiring that they match
        #adds authenticate method that returns the user when the password is correct (and false otherwise)
        has_secure_password
        PASSWORD_FORMAT = /\A
            (?=.{8,})          # Must contain 8 or more characters
            (?=.*\d)           # Must contain a digit
            (?=.*[a-z])        # Must contain a lower case character
            (?=.*[A-Z])        # Must contain an upper case character
            (?=.*[[:^alnum:]]) # Must contain a symbol
        /x
        validates :password, presence: true, length: {minimum: 8}, format: {with: PASSWORD_FORMAT}
        validates :password_confirmation, presence: true
    end
    

    seeds.rb

    user_1 = User.create!(name: 'Han Solo', email: 'han@example.com', password: 'Password123!', password_confirmation: 'Password123!')
    user_2 = User.create!(name: 'Luke Skywalker', email: 'luke@example.com', password: 'Password123!', password_confirmation: 'Password123!')
    

    我通过打开rails控制台,运行User.delete_all并看到它们从SQL记录中删除来测试用户是否正确创建。