Rails没有为“created_at”属性或“id”赋值。

时间:2014-11-28 01:56:11

标签: ruby-on-rails

我是编程新手,已经学习Ruby on Rails大约10周了。在Rails控制台中,每当我创建一个模型的新实例时,所有属性都会出现nil:

2.0.0-p576 :002 > List.create
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
 => #<List id: nil, name: nil, user_id: nil, created_at: nil, updated_at: nil>

在创建模型实例时,Rails不应该自动生成List id和created_at吗? 这是我的模式文件:

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

  create_table "items", force: true do |t|
    t.string   "body"
    t.integer  "list_id"
    t.boolean  "done",       default: false
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "items", ["list_id"], name: "index_items_on_list_id"

  create_table "lists", force: true do |t|
    t.string   "name"
    t.integer  "user_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "lists", ["user_id"], name: "index_lists_on_user_id"

  create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.string   "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string   "unconfirmed_email"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

end

我知道这应该是一个简单的问题,我已经搜索了一段时间以获得答案,但还没有想出任何答案。任何帮助表示赞赏。

以下是模型:

class List < ActiveRecord::Base
  belongs_to :user
  has_many :items

  validates :name, length: { minimum: 5 }, presence: true
  validates :user, presence: true
end

我为列表名称和用户添加了值,以便它通过验证,但我仍然遇到同样的问题。

2.0.0-p576 :001 > list = List.create(name: "Grocery List", user: User.first)
  User Load (2.6ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
   (0.1ms)  begin transaction
   (0.2ms)  rollback transaction
 => #<List id: nil, name: "Grocery List", user_id: nil, created_at: nil, updated_at: nil>

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说,您遇到的问题是因为您的对象验证失败。日志中的线索是rollback transaction;这通常表示某种阻止对象持久化的异常。

这解释了缺少idcreated_at值。由于对象永远不会持久化,因此永远无法设置这些值。

在您的情况下,您有两个验证器:

validates :name, length: { minimum: 5 }, presence: true
validates :user, presence: true

从这些代码行中可以清楚地看出,nameuser都需要填充,name必须至少包含5个字符。

所以你必须做这样的事情:

list = List.create(name: "list_name", user: User.first)

注意:User.first可以替换为任何用户对象,仅用于演示目的。