我的sqlite数据库无法保留任何内容?

时间:2018-02-06 06:14:21

标签: ruby-on-rails sqlite ruby-on-rails-5 rails-api

我有一个带模型,控制器和序列化器的Rails Api。数据库已设置完毕,我进行了多次迁移,所有这些迁移都导致了对模式的相应更改。但是,在rails控制台或种子数据中没有任何内容持久存储到数据库。例如,当我尝试在控制台中运行User.create时,我会看到此消息:

2.3.3 :003 > User.create
(0.1ms)  begin transaction
(0.1ms)  rollback transaction
=> #<User id: nil, email: "", created_at: nil, updated_at: nil>  

同样,我在种子文件中有这些数据:

users = User.create([{ email: 'adam@adam.com' }, { email: 'ryan@ryan.com' 
 }])
BankAccount.create(name: 'Adams Chase Checking Account', user_id: users.first) 

当我运行rake db:seed并尝试在rails控制台中调用User.all或BankAccount.all时,我在两种情况下都会得到一个空数组。我听说这样的错误是由模型上的未满足的验证引起的,但我的模型没有任何验证。我不知道可能导致这个问题的原因。任何帮助是极大的赞赏!此外,对于它的价值,这个项目使用Rails 5.1.4,我之前只使用过4.x.x.这是用户模型(使用设计):

class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable 
has_many :bank_accounts 
has_many :credit_cards
has_many :investments 
has_many :loans 
has_many :assets 
has_many :recurring_payments, through: :bank_accounts
has_many :recurring_payments, through: :credit_cards
has_many :recurring_payments, through: :investments
has_many :recurring_payments, through: :loans
end  

以下是银行帐户模型:

class BankAccount < ApplicationRecord 
belongs_to :user 
has_many :recurring_payments 
accepts_nested_attributes_for :recurring_payments
end

这是完整的架构:

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

create_table "assets", force: :cascade do |t|
t.string "name"
t.integer "value"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "bank_accounts", force: :cascade do |t|
t.string "name"
t.integer "balance"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "credit_cards", force: :cascade do |t|
t.string "provider"
t.integer "balance"
t.integer "interest_rate"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "investments", force: :cascade do |t|
t.string "name"
t.integer "value"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "loans", force: :cascade do |t|
t.integer "user_id"
t.integer "interest_rate"
t.integer "remaining_balance"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "recurring_payments", force: :cascade do |t|
t.string "source"
t.boolean "status"
t.date "pay_date"
t.integer "pay_amount"
t.integer "duration"
t.integer "bank_account_id"
t.integer "credit_card_id"
t.integer "loan_id"
t.integer "investment_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "users", force: :cascade do |t|
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.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: 
"index_users_on_reset_password_token", unique: true
end

end

1 个答案:

答案 0 :(得分:0)

我的猜测就是这个。

users = User.create([{ email: 'adam@adam.com' }, { email: 'ryan@ryan.com' }])

Devise在保存之前验证默认密码(最少6个字符)。尝试在控制台中运行此命令,看看它是否会抛出任何错误?

user = User.create(email: 'adam@adam.com')
user.errors