2011-02-08 5 views
13

hihorails 3文字列の妥当性確認

私の文字列が「何か」ではないかもしれないということをレールに伝える方法はありますか?

私は

validates :string, :not => 'something' 

おかげ klump

答えて

22

仕事をするこれらのどちらか(文書化のための方法をクリックしてください)のようなものを探しています:おそらく最高の

  1. 最も速い方法で、他の単語のために伸ばしやすい:

    validates_exclusion_of :string, :in => %w[something] 
    
  2. これは正規表現を使用することの利点を持っているので、あなたは簡単に一般化することができます:

    validates_format_of :string, :without => /\A(something)\Z/ 
    

    あなたは/\A(something|somethingelse|somemore)\Z/

  3. これは、あなたが達成可能な一般的なケースであると、他の言葉に拡張することができますいずれかの検証:

    validate :cant_be_something 
    def cant_be_something 
        errors.add (:string, "can't be something") if self.string == "something" 
    end 
    
  4. 正確にあなたが使用することができますあなたが提案した構文(validates :string, :not => "something")を取得するにはこのコードは(レールのソースのマスターブランチを読んでいる間にこれを発見しましたが、それはうまくいくはずですが、ですが、3ヶ月前のインストールでは動作しません)。いくつかの方法

    class NotValidator < ActiveModel::EachValidator 
        def validate_each (record, attribute, value) 
        record.errors[attribute] << "must not be #{options{:with}}" if value == options[:with] 
        end 
    end 
    

+0

+1良いもの!私たちの答えは収束していると思います:) –

+0

ええ、両方ともかなり徹底的にカバーしていると思います;) '\ A'と' \ Z'を使うのはおそらくより安全なアイデアです。 –

7

:あなたのパスにこのどこかを追加します。あなたは何の正確なリストを持っている場合、それはすることはできません。

validates_exclusion_of :string, :in => ["something", "something else"] 

あなたはそれがすべてで列として存在していないことを確実にしたい場合:

validates_format_of :string, :with => /\A(?!something)\Z/ 

それはより複雑である場合と、あなたは面倒な詳細を隠したい:

validate :not_something 

def not_something 
    errors.add(:string, "Can't be something") if string =~ /something/ 
end