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をチェックインしたので、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!