2011-04-22 4 views
1

に保存することはできません私は、私は私はそれがまだないときにリンクを追加したいこのルビーDataMapperのは、データベース

links.each do |link| 
    puts link 
    if Image.all(:url=>link).empty? == true 
    img=Image.create(:url => link) 
    puts "Cannot save to database "if img.saved? == false 
    end 
end 

のようなループを持っている

DataMapper.setup :default, "sqlite://#{Dir.pwd}/image.db" 
class Image 
    include DataMapper::Resource 

    property :id  , Serial 
    property :url , String,unique: true 
    property :desc , String,unique: true,default: "empty" 
end 
DataMapper.finalize.auto_upgrade! 

などのデータベーススキーマを持っていますデータベースに保存する。私はスクリプトを実行し、常に取得することはできませんデータベースに保存します。私は間違って何をしていますか?助けてくれてありがとう。 編集:私は私のコードに

DataMapper::Logger.new($stdout, :debug) 

を追加し、何のINSERTクエリのみ選択はありませんでした。

答えて

3

あなたが宣言:一意であるDESCプロパティをし、「空」にデフォルト値を設定し、あなたのコード例では、あなたがしています一意性検証の失敗につながるdescを指定せずにImageを作成すると、画像が保存されません。一意のオプションをdescプロパティ宣言から削除するか、画像を作成するときにdescに一意の値を指定してください。また

、あなたが任意の検証エラーはこれを試して見ることができるので、あなたのコードはより冗長にする:

links.each do |link| 
    image = Image.new(:url => link) 

    if image.save 
    puts "Image saved" 
    else 
    puts "Failed to save image: #{image.errors.inspect}" 
    end 
end 

あなたは「DM-検証」宝石を必要とする必要が検証エラーを使用することに注意してください。

+0

助けてくれてありがとうございました。それは完全に動作します。 – John

+0

[Datamapper](http://datamapper.org/docs/create_and_destroy.html)にエラー時に例外を発生させるよう依頼することができます: 'Image.raise_on_save_failure = true' –

0

"データベースに保存できません"とはどういう意味ですか?

あなたはこのような何かを試してみて、それが少し良く動作するかどうかを確認することができます

links.each do |link| 
    if Image.first(:url => link) 
    p "image exists" 
    else 
    if Image.create(:url => link) 
     p "Image succesfully saved" 
    else 
     p "could not save image" 
    end 
    end 
end 
+0

私のスクリプトが終了したら、データベースはまだ空です。ドキュメントによると、 "作成が成功した場合、#createは新しく作成したDataMapper :: Resourceを返します。失敗した場合、指定された属性とそのリソースに対して宣言されているデフォルト値で初期化される新しいリソースを返します。作成が成功したかどうかを調べるには、返されたリソースの#saved?を呼び出すことができます。リソースが正常に永続化された場合はtrueを返し、それ以外の場合はfalseを返します。そして、なぜ私は保存されてチェックするのですか?データベースがまだ空白のため – John