2016-09-23 9 views
0

モデルでは、新しいユーザーを検証し、保存する前にユーザー名をダウンシェアしようとしています。Rails4 - validates_format_of:user_name.downcase not working

私はこれが働くだろうと思った:

validates_format_of :user_name.downcase,:with => /\A[0-9a-zA-Z]*\z/ 

残念ながら、それはしません。

どうすればいいですか?

おかげ

答えて

1

私はカスタムセッターあなたは、あなたがそれに任意の文字列を代入するときは、必ずUSER_NAMEでdowncased文字列を持っていると確信しています方法

def user_name=(value) 
    self[:user_name] = value.downcase 
end 

となるだろうが

で何が悪いですあなたのコードは次のとおりです:user_name.downcaseは実際には文字列 "user_name"(user_nameシンボル、to_s、downcase)で、正規表現は大文字に一致します

変更先:

validates_format_of :user_name,:with => /\A[0-9a-z]*\z/ 
+0

ありがとうございます。私はレールが大好きですが、時にはレールの魔法(それは27の異なる方法で何かをする能力)が私を狂ってしまいます。また、正規表現の素晴らしい1つは、私はそれを完全に逃した。 – user3096851

+0

あなたの最初の必要条件としては、検証が必要なだけで、本当にいくつかの方法があります。あなたは正規表現のA-Zを見逃してしまいました。カスタムセッターは単なる提案であり、すべてのエスケナリオには適合しないかもしれませんが、私はそれがあなたのものに合うかもしれないと思います。 – arieljuod

+0

それは私が欲しかったものです。私はこの問題に疲れています。すべてのユーザー名を常に小文字にしたいと思っています。再度、感謝します。 – user3096851

0

あなたはvalidates_format_ofbefore_saveコールバック

まずでこれら二つの作業を行うことができますuser_nameの形式を検証し、その後before_saveコールバックでそれをdowncase。

validates_format_of :user_name, with: /\A[0-9a-zA-Z]+\z/ 
before_save :downcase_name 

private 

def downcase_user_name 
    self.user_name = user_name.downcase 
end