1

データベースに同じ形式で格納できるように、UPC 文字列コードを正規化するのに少し問題があります。

私はean宝石を使用して文字列が適切かどうかを確認しています (これは正常に機能しています) が、検証後に次のような割り当てコードをスローすると:

validate :upc_check

def upc_check
    if !upc.nil?
        if !upc.ean?
            errors.add(:upc, 'is not a valid UPC.')
        else
            upc = upc.strip
        end 
    end 
end 

strip 呼び出しは文字列であるため、単なる例です。私は実際にupcのダッシュを削除します。

上記のコードは、実際には保存されないため、うまく機能しません。私は次のようなメソッドをトリガーすることを見ました

after_validation :normalize_upc

def normalize_upc
    upc = upc.strip
end

..しかし、上記も機能しません。

検証後にデータを検証して変換するために、皆さんは何をしていますか?

4

2 に答える 2

1

バリデーターを厳密にしてから、 before_validation フィルターを使用して必要な変換を行います。

于 2010-12-05T03:00:15.817 に答える
1

upc のモデルで setter メソッドをオーバーライドし、それを正規化するための別のメソッドを用意しないことをお勧めします。これは、次のような方法で実現できます。

def upc=(value)
  self.upc = value.strip
end

編集:

また、検証メソッドをクリーンアップして、次のようにこの機能を削除します。

validate :upc_check, :unless => lambda {|m| m.upc.nil?}

def upc_check
  errors.add(:upc, 'is not valid') unless upc.ean?
end
于 2010-12-05T02:18:39.313 に答える