##==================================User Model====
class User < ActiveRecord::Base
validates :name,presence: true ,message: "Name can't be empty."
end
##===========================Migration==============
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name ,null: false
end
end
end
##==================================Schema.rb================
ActiveRecord::Schema.define(version: 20151030131541) do
create_table "users", force: :cascade do |t|
t.string "name", null: false
end
end
##==========================Rails console==============
irb(main):009:0> User.create
(0.2ms) begin transaction
SQL (0.5ms) INSERT INTO "users" DEFAULT VALUES
(139.6ms) commit transaction
=> #<User id: 4, name: nil>
irb(main):010:0>
我正在使用sqlite3作为数据库。即使我在模型中进行了验证并且在迁移中有NOT NULL条件,但仍然创建了名为:nil的用户,有人可以解释这是如何实现的吗?
答案 0 :(得分:0)
它实际上并没有创建记录。根据{{3}}:
尝试使用关系中定义的相同范围属性创建新记录。如果验证失败,则返回初始化对象。
最后一句是关键...返回initialized
对象。它是一个无效的对象,尚未添加到数据库中。
尝试User.create!
,因为bang方法会引发异常,而不是无效的对象。
答案 1 :(得分:0)
您的验证码不正确。它应该是:
validates :name, presence: { message: "can't be empty." }
文字&#34;姓名&#34;为你添加。
所以:
尝试回滚迁移并从终端重新迁移:
rake db:rollback
rake db:migrate
然后重新加载您的控制台并尝试:
user = User.create
user.id
#=> nil #Shows it has not saved
user.errors.full_messages
#=> ["Name can't be empty."]
User.count
# (0.2ms) SELECT COUNT(*) FROM "users"
#=> 0
在复制项目和修复验证问题时,我得到的行为是什么。