2012-07-27 64 views
0

我編寫了一個應用程序,我計劃通過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! 

回答

0

谷歌搜索。此外,我通過this link發現,

there is a guard around defining property getter in dkubb/dm-core

。從模型中刪除getter方法後,一切正常。