2011-03-07 8 views
1

を保存するときに、次の正規表現は、末尾のスペースを許可する電話番号を(ただし、何だったかもしれない)、検証し、それらを削除する:検証正規表現形式は、エントリのスペースを許可するものの、レコード

validates :phone, 
      :presence => true, 
      :format => {:with => /\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}[ ]*\z/} 

私ができるようにしたい理由一部のユーザーが誤って入力する可能性があるため、最後のスペースは簡単です。

私ができることをしたいのは、検証中にこれらのスペースを許可することですが、レコードを保存するときに、先行/後続のスペースを取り除きます。このようにして、ユーザーは小さな "間違い"(つまり最後にスペース)を作成することができますが、データベースに保存された "完全に有効な"値(この場合は電話番号)は保存されます。

保存する前に各フィールドを特別にトリミングする必要がないように、これを(モデル、フィールドごとに)自動的に行うことはできますか?あなたは一部のフィールドだけのためにこれをやっている場合は

答えて

2

、それを達成する最も簡単な方法は、カスタム設定主体と次のようになります。

def phone_number=(val) 
    self[:phone_number] = val.rstrip 
end 

しかし、あなたはより一般的な、使用-どこでもセットアップをしたい場合、私はActiveRecordの拡張を書くことをお勧めしたい - の線に沿って何か:

class ActiveRecord::Base 
    def self.strips_trailing_spaces_from(*attrs) 
     @@sts_attrs ||= [] 
     @@sts_attrs << attrs 
     before_save :strip_trailing_spaces 
    end 

    def strip_trailing_spaces 
     @@sts_attrs.each do |attr| 
      val = self[attr] 
      self[attr] = val.rstrip if val.is_a?(String) 
     end 
    end 
end 

そして、あなたがこれを使用するすべてのモデルのために、あなたは、単に(Railsの「マクロ」スタイル)を呼び出すことができます。

0123を
class MyModel < ActiveRecord::Base 

    strips_trailing_spaces_from :phone_number, :name, :pizza, :etc 

    # ...classy stuff... 
end 

注 - このコードはテストされていませんが、このコードはアイデアを得るはずです。それが役に立てば幸い!

+0

ありがとうございます、これは良いスタートです! – Zabba

-1
 
# strip leading and trailing whitespace in s 
# ... simply: 
s.strip!     # modify s 
s.strip     # return modified string 
# ... or with a regex 
s.gsub!(/^\s+|\s+$/, '') # modify s 
s.gsub(/^\s+|\s+$/, '') # return modified string 
関連する問題