2012-03-05 11 views
3

フォームが空の文字列を返すので、フォームから十進数フィールドに値を設定しない方法はありません。ここでは手動であなたが見ることができるように、それが設定されていないとき、またはそれがゼロに設定されている場合は、list_priceフィールドは喜んで保存されます''数字のDataMapperフィールドを空白の値に設定できません

require 'dm-core' 
require 'dm-mysql-adapter' 
require 'dm-migrations' 

DataMapper.setup(:default, 'mysql://localhost/test') 

class Product 
    include DataMapper::Resource 
    property :id, Serial 

    property :list_price, Decimal 
end 

DataMapper.finalize 

DataMapper.auto_migrate! 

p = Product.new 
puts p.save #=> true 

p = Product.new(:list_price => '') 
puts p.save #=> false 

p = Product.new(:list_price => nil) 
puts p.save #=> true 

にフィールドを設定し、超簡単なテスト・ケースです。しかし、空の文字列を使用すると、まったく保存されません。一見型変換されていないようです。

これはORMのかなり基本的な使用事例なので、私はここではっきりと何かを見逃すはずです。

答えて

2

プロパティの型をチェックする独自のセッターメソッドを作成することができます。 Datamapper properties documentation pageの「オーバーライドアクセサ」のセクションを参照してください。追加

def list_price=(new_price) 
    new_price = nil if new_price == '' 
    super 
end 

をごProductクラスにはnilに変換するlist_priceの値として設定されている任意の空の文字列を引き起こし、資源を保存することができます。

+1

これで問題は解決しますが、手動で行う必要はありません。 ORMを持っているのはなぜですか? – Emily

+1

@Emilyこの関連する問題が見つかりました:https://github.com/datamapper/dm-core/issues/41。 "...空の文字列をnilsに型キャストするのはDataMapperの責任ではないと判断しました"。彼らはそれがWebアプリケーションのために役に立つと認めている。おかげさまで、ありがとうございます。 – matt

+0

私は検索でそれを振り向いていませんでした。悲しいことに、スレッドで示唆されているように実際にはdm-railsにしていないようです。私はそれをサポートするために猿のパッチを当てた '型キャスト(typecast) 'を終わらせました。 – Emily

関連する問題