了解在rails中创建

时间:2015-10-30 16:24:09

标签: ruby-on-rails

##==================================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的用户,有人可以解释这是如何实现的吗?

2 个答案:

答案 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

在复制项目和修复验证问题时,我得到的行为是什么。