我編寫了一個應用程序,我計劃通過DataMapper和sqlite3保存用戶數據,並使用GDBM保存用戶數據(其中幾個)。當我用irb運行這個時,User.new和inventory方法可以正常工作,但是DataMapper說我的用戶模型是無效並且不保存。我之前和DataMapper一起工作過,從來沒有遇到過這樣的錯誤,實際上我在sinatra-datamapper app中使用了相同的用戶模型(使用密碼salt和hash),沒有任何錯誤。DataMapper中的DataObject :: Integrity錯誤
爲了清楚起見,我打算將用戶名和'gdbm數據庫文件的路徑'保存爲datamapper中的字符串。 gdbm創建自己的數據庫文件,所有方法都可以正常工作,沒有抱怨,所有數據都是持久的。由於我不是試圖保存gdbm對象,而是隻有datamapper中的一個字符串,我認爲應該沒有驗證問題。
DataMapper::Model.raise_on_save_failure = true
不給錯誤的具體描述,但save!
方法提供了以下錯誤:
DataObjects::IntegrityError: users.name may not be NULL (code: 19, sql state: , query: INSERT INTO "users" DEFAULT VALUES, uri: sqlite3:/home/barerd/game_inventory/users.db?scheme=sqlite3&user=......
但name屬性是不是空的,因爲我在IRB檢查。
也許錯誤來自sqlite,但我沒有知識來測試。有人可以指導我如何檢查這個錯誤?
require 'gdbm'
require 'data_mapper'
require 'dm-validations'
DataMapper.setup :default, 'sqlite://' + Dir.pwd + '/users.db'
class User
attr_reader :name, :inventory_db
include DataMapper::Resource
property id, Serial
property :name, String, :required => true, :unique => true, :messages => { :presence =>...... etc }
property :inventory_db, String
def initialize name
@name = name
@inventory_db = Dir.pwd + '/#{name}_inventory.db'
end
def inventory
GDBM.new @inventory_db, 0644, GDBM::WRCREAT
end
..several methods related to inventory..
end
DataMapper.finalize.auto_migrate!