2011-02-03 7 views
0

私はRuby on Rails 3とMYSQLデータベースを使用しています。私は、データベースから正規表現を取得し、電子メールアドレスを検証するためにその値を使用したいと思います。Ruby on Railsを使用して電子メールアドレスを検証するためにMYSQLデータベースからRegexを取得

私は、私のRoRアプリケーションコードでは正規表現の値を一行に入れないことを目指していますが、他の用途や他の場所から呼び出すことができます。

Parameter.find_or_create(
    :param_name  => 'email_regex', 
    :param_value  => "[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", 
) 

お知らせ: 'seed.rb' ファイルに私が編集したデータベースを作成するために

は、私は私の 'RAILS_ROOT/DB/seed.rb' は以下に置きます少し元の正規表現www.regular-expressions.infoから\の直前に$の2つを加えます。ここではそれが違いです:

#original from www.regular-expressions.info 
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? 
#edited by me 
[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? 

実行rake db:seed後、ターミナルで、MYSQLデータベースに私は($近く\なしを)この値を持っている:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? 

その後、私は使用して私のRoRのアプリケーションで正規表現は次のようになります:

def validate(string) 
    email_regex = Regexp.new(Parameter.find_by_param_name('email_regex').param_value) 
    if email_regex.match(string) 
    return true 
    else 
    return false 
    end 
end 

probl上記の正規表現を使用してEMは、私が正常に「@」ダブルまたはこれらのような最後の部分なしにもメールアドレスを検証することができるということです。

[email protected]@gmail.com # Note the double '@' 
[email protected] 

もちろん、私はそれらの電子メールアドレスを拒否したいと思います。だから、どうすれば調整できますか?または、私は何をしたいのですか?


私は、これらの正規表現をシードすることも試してみました:

#case 1 
A[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?Z 

#case 2 
\A[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\Z 

#case 3 
^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$ 

だけでなく、予想通り、それらは動作しません:MySQLデータベースにそれぞれなっていること

#case 1 
\A[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\Z 

#case 2 
\\A[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\Z 

#case 3 
^[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$ 


UPDATE

デバッグ私はちょうどすべての/文字の前に、Rubyは\文字を追加したことを意味し

--- !ruby/regexp /[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/ 

を持っています。それは私の問題だろうか? 'seed.rb'ファイルでは、すべて/\文を追加してエスケープしようとしましたが、デバッグ出力は常に同じです。

答えて

0

このホイールを改造しないでください。 Rails 3の電子メールアドレスを検証する標準的な方法については、http://lindsaar.net/2010/1/31/validates_rails_3_awesome_is_trueを参照してください。

ホイールの再製作を選択する場合は、正規表現を使用しないでください。なぜこれが悪い考えであるのかについての詳細は、http://oreilly.com/catalog/9780596528126で説明されています。非常に複雑な正規表現がほぼとなっています。

+0

電子メールの検証にemail_regexを使用しています。申し訳ありませんが、それはホイールを再発明しています。 – btilly

+0

私はそれが正しい理由で必要です。 – user502052

2

ここに非常に多くのレベルで間違っているので、多くのものがありますが...あなたのデータベース内

  1. 保存するアプリケーション設定はお勧めしません。パフォーマンスの低下、潜在的なキャッチ22(データベースの設定方法、データベースからの設定など)などがあります。独自のシングルトン構成を作成したり、イニシャライザを使用する必要がない場合は、SettingsLogicのようなものを試してみてください。
  2. Railsには、ActiveRecord :: Baseから継承したモデルの一部であるmixinとしての検証機能が組み込まれています。このような基本的なケースでは、独自の検証ルーチンを定義するのではなく、それを使用する必要があります。
  3. は実際には複数の@記号付きのメールアドレスを持っていますが、最初のメールアドレスはバックスラッシュでエスケープされているか、アドレスのローカル部分は引用されています。
  4. $文字を特別な意味を持たない文字クラスでエスケープしているのはなぜですか?
  5. 正規表現は、電子メールアドレスを非常に基本的に検証して、メールサーバーに渡す完全なガベージデータが得られないことを確認しても問題ありませんが、電子メールアドレスを確認する最良の方法はありません。

RubyOnRails.orgのvalidations guideをよくご覧ください。

+0

4. Regex文の行にある "seed.rb"ファイル(NetBeans IDEを使用)の "予期しないnull"値の警告があるためです。 ? – user502052

+0

私は質問を更新しました – user502052

+0

私は電子メールアドレスを検証するためのより多くの方法にも興味があります。 – mikezter

関連する問題