0

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

为了清楚起见,我打算将用户名和“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 中检查时,名称属性不为空。

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

1 回答 1

0

进一步谷歌搜索,我发现

在 dkubb/dm-core 中定义属性 getter 有一个守卫

通过这个链接。从模型中删除 getter 方法后,一切正常。

于 2012-08-01T12:03:02.980 回答