2016-05-01 8 views
2

私は、ユーザーが指定したパラメーターがすべての状況でダウンケースされ、取り除かれていることを確認する最も良い方法を知りたいと思います。Model属性が常にダウンケースされ、取り除かれる最良の方法はありますか?

私は次のことを実現したいと思います:剥奪は/ DBに対して

  • クエリをdowncasedない限り、属性がDBに保存されないこと

    1. 保証は常にdowncase/
    2. 属性を取り除く必要があります検証は、ユーザー指定のパラメータのダウンケース/ストリッピングバージョンに対して実行されます。
    3. モデルはダウンケース/ストリップ属性を返します(項目#1で問題はありません)
  • 答えて

    0

    before_saveコールバックメソッドを記述する必要があります。このメソッドでは、ユーザーが設定した属性をダウンして削除します。例えばのために

    class User < ActiveRecord::Base 
        before_save :format_values 
    
        def format_values 
        self.name = self.name.downcase 
        end 
    end 
    

    EDIT

    私は検証についてのあなたの第三のポイントを逃していました。したがって、これらの値についても検証を実行する必要がある場合。代わりにbefore_validationコールバックを使用する必要があります。

    0

    あなたはbefore_validationコールバックにそれを行うだろう:

    # in your model 
    before_validation :normalize_attribute 
    
    private 
    def normalize_attribute 
        # change `attribute` to your actual attribute's name 
        self.attribute = attribute.strip.downcase if attribute 
    end 
    

    それとも、カスタムのセッターであることを行うことができます:

    # change `attribute` to your actual attribute's name 
    def attribute=(value) 
        write_attribute(:attribute, value.strip.downcase) if value 
    end 
    

    は、最初のオプションは、属性の値オブジェクトがあるたびにサニタイズされます値が変更されていなくても保存されます。これは、データベースのレコードがすでに存在するときにこのsanitizeメソッドを導入すると役立ちます。これは、Railsコンソールの1行のコードですべての既存のレコードをサニタイズすることができるためです。Model.find_each(&:save)。 2番目のオプションは、値が設定されたときにのみサニタイズします。これはもう少しパフォーマンスが良いです。

    どちらの場合でもif attributeを確認することをお勧めします。そうでない場合は、strip.downcasenilに設定すると、例外が発生する可能性があります。

    +0

    あなたが気にしない場合は、あなたが1つのオプションを選択したときに含める回答を更新してください。 –

    +0

    @BillyBlobSnortin:Done – spickermann

    0
    class User < ActiveRecord::Base 
        before_validation :format_values 
    
        def format_values 
        self.name = self.name.strip.downcase if name 
        end 
    end 
    
    0

    コメントに基づいて答えを更新しました。

    コールバックを使用する必要はありません(とにかくコールバックは使用しないでください)。あなたの属性のセッターをオーバーライドするだけです。

    class MyModel 
        def some_attribute=(value) 
        value = value.strip.downcase if value 
        write_attribute(:some_attribute, value) 
        end 
    end 
    
    +0

    これにより、非ダウンケート/ストリッピングされていない値を保持することはできませんか? –

    +0

    はい。私は答えを更新します。 –

    +0

    @BillyBlobSnortinがこの仕事をしましたか? –