我有一个带模型,控制器和序列化器的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
答案 0 :(得分:0)
我的猜测就是这个。
users = User.create([{ email: 'adam@adam.com' }, { email: 'ryan@ryan.com' }])
Devise在保存之前验证默认密码(最少6个字符)。尝试在控制台中运行此命令,看看它是否会抛出任何错误?
user = User.create(email: 'adam@adam.com')
user.errors