2010-12-05 55 views
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 

ストリップコールだけです例としては文字列です。私は実際にupcのダッシュを削除しています。

上記のコードは実際には保存されないのでうまく機能しません。

after_validation :normalize_upc 

def normalize_upc 
    upc = upc.strip 
end 

のようにメソッドをトリガしました。しかし、上記のいずれも機能しません。

検証後にデータを検証して変換するにはどうしますか?

答えて

1

私は私のバリデータが厳密になるだろう:

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

編集:

私もそうのように、この機能を削除するために、あなたの検証メソッドをクリーンアップするでしょう。このようなもので達成されますbefore_validationフィルターを使用して必要な変換を行います。

+0

ありがとうございました。それはうまくいく。 – Nitrodist

1

upcのモデルでsetterメソッドをオーバーライドし、それを正規化するための別のメソッドを持たないことをお勧めします。 、

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

def upc_check 
    errors.add(:upc, 'is not valid') unless upc.ean? 
end 
+0

ヒントをありがとう。私は上記を試しましたが、コンソールから設定しようとすると、スタックレベルが深すぎます。思考?たとえば、 – Nitrodist

+0

https://gist.github.com/728710 – Nitrodist

+1

私の悪い点は、私が書いたものでセッターメソッドを呼び出すことだけです。 self.upcをsuper(value.strip)に変更するか、write_attributeを使用してください –

関連する問題