DataMapper中的DataObject :: Integrity错误

时间:2012-07-27 10:06:24

标签: ruby sqlite validation datamapper

我写了一个应用程序,我计划通过DataMapper和sqlite3保存用户数据,并使用GDBM保存库存项目(其中几个)。当我用irb运行它时,User.new和库存方法工作正常,但是DataMapper说我的用户模型无效并且不保存。我之前使用过DataMapper并且从未遇到过这样的错误,实际上我使用了相同的用户模型(使用密码salt和hash)而没有sinatra-datamapper app中的任何错误。

要清楚,我打算将用户名和“gdbm数据库文件的路径”保存为datamapper中的字符串。 gdbm创建自己的db文件,所有方法都可以正常工作而不会抱怨并且所有数据都是持久的。由于我不是想保存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=......但是当我在irb。中检查时,name属性不为空。

也许错误源自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!

1 个答案:

答案 0 :(得分:0)

进一步搜索,我发现了

  

在dkubb / dm-core

中有一个围绕定义属性getter的保护

通过this link。从模型中删除getter方法后,一切正常。