2

Rails コンソールから SQLiteDB に新しいレコードを挿入しようとしています。を使用するだけUser.create()です。

行がデータベースに表示されません。メッセージはユーザーが存在することを意味しますが、呼び出しUser.firstが返さnullれ、データベースを確認すると空のテーブルが表示されます。私は何が欠けていますか?

入力:

console > User.create(name: 'don', email: 'don@gmaill.com', password: 'test', password_confirmation: 'test')

出力:

   (0.1ms)  begin transaction
  User Exists (0.1ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'don@gmaill.com' LIMIT 1
   (0.0ms)  rollback transaction
 => #<User id: nil, name: "don", email: "don@gmaill.com", created_at: nil, updated_at: nil, password_digest: "$2a$10$3EK3L932ryjrJPFIc4E0/uzavrpkWylDRzx4Wkdwzx8d..."> 

ユーザー クラス:

class User < ActiveRecord::Base
    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, format: { with: VALID_EMAIL_REGEX }, 
                                        uniqueness: { case_sen,sitive: false }

    has_secure_password
    validates :password, length: { minimum: 6 }
end
4

2 に答える 2

2

ユーザーを永続化していません(rollbackステートメントでわかります)。メールの一意性検証に失敗しているようです。作成しようとしerrors.full_messagesたを呼び出すか、代わりに を使用して、エラーを確認できます。Usercreate!create

于 2013-11-05T05:17:30.420 に答える
1

ほとんどの場合、フィールドの一意性を検証していemailます。したがって、ActiveRecord はselect最初に、同じ電子メール アドレスを持つレコードが存在するかどうかをチェックし、それを見つけます。したがってCreate、新しいレコードをデータベースに保存していません。

とにかくcreateオブジェクトを返します。

これを確認するためにこれを試すことができます。の代わりに、続けてcreateみてくださいnewsave!

console > u = User.new(name: 'don', email: 'don@gmaill.com', password: 'test', password_confirmation: 'test')
console > u.save!

このエラーを取り除くには、まず DB に存在するレコードを削除します

于 2013-11-05T05:18:47.713 に答える