我是编程新手,已经学习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>
答案 0 :(得分:0)
正如我在评论中所说,您遇到的问题是因为您的对象验证失败。日志中的线索是rollback transaction
;这通常表示某种阻止对象持久化的异常。
这解释了缺少id
和created_at
值。由于对象永远不会持久化,因此永远无法设置这些值。
在您的情况下,您有两个验证器:
validates :name, length: { minimum: 5 }, presence: true
validates :user, presence: true
从这些代码行中可以清楚地看出,name
和user
都需要填充,name
必须至少包含5个字符。
所以你必须做这样的事情:
list = List.create(name: "list_name", user: User.first)
注意:User.first
可以替换为任何用户对象,仅用于演示目的。