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

1 に答える 1

0

さらにググってみたら分かった

dkubb/dm-core でプロパティ ゲッターを定義する際のガードがあります。

このリンクから。モデルから getter メソッドを削除した後、すべてが正常に機能しました。

于 2012-08-01T12:03:02.980 に答える