2009-03-23 17 views
3

私が構築している現在のアプリケーションでは、ユーザーがカンマ区切りの電子メールアドレスのリストを入力するテキストエリアがあります。複数の電子メールを検証し、Railsのエラーを処理する最良の方法は何ですか?

現在、リストを配列に分割し、1つずつ保存しています。 、と言う、私はこの入力を持っている場合しかし...

[email protected]、例@テストは、[email protected]

...その後[email protected]は保存されますが、保存されますtest @ exampleは失敗します。そこで、test @ exampleが有効な電子メールアドレスではないというエラーを表示するときに、カンマ区切りの値の文字列から[email protected]を削除してテキストエリアに戻す必要があります。

サーバ側でこれらを検証し、コントローラで厄介な/醜いことなくエラーを処理するには、より良い方法がありますか?

ありがとうございました!

答えて

3

これはそのモデルであると仮定すると、 has_manyの電子メール、および電子メールのモデルが使用されます。validate_emailを、次のような何かができる:

class Foo < ActiveRecord::Base 
    validate :must_not_have_invalid_addresses 

    ... 

    def emails=(addresses) 
    @invalid_addresses = [] 
    addresses.split(",").each do |address| 
     @invalid_addresses.push(address) unless emails.create({:address => address}) 
    end 
    end 

    def must_not_have_invalid_addresses 
    errors.add_to_base("Some email addresses were invalid") unless @invalid_addresses.empty? 
    end 

end 

これは、検証エラー+あなたが好きならば、あなたのビューにアクセスできるようにすることができ、無効な電子メールアドレスの配列を提供。

-1

あなたはemailsという変数にそれらを持っている場合は、おそらくこのような何かが働く可能性があります

if valid_emails?(emails) 
     # then have your normal logic here 
     if @user.save 
      flash[:notice] ..... 

     end 
    end 

    private 
    def valid_emails?(emails) 
     not emails.find {|email| email =~ /[\w\.%\+\-][email protected](?:[A-Z0-9\-]+\.)+(?:[A-Z]{2,}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|jobs|museum)/i }.nil? 
    end 

はEDIT:実際にあなたはこの正規表現を使用することもできます。安静認証プラグインから取得されました。

0

ルビーのようなhere

を説明するように、あなたは(あなたのセパレータとして「」を使用して)文字列を分割して、正規表現を使用したい正規表現をhereを説明し、サポートしているスプリット機能(.each)を持っています各電子メールを検証します。

0

電子メールをトランザクションに保存することができます。次に、保存が失敗すると、すべての保存前の保存がキャンセルされます。そのような場合、バリデーションはモデルレイヤー上でのみ行うことができます。

私はそれを明確にコードになると思いますが、確かにそれは最速の方法ではありません(ただし、ルビーを使用して、あなたも高速な方法でそれをやっていないことを意味;))

関連する問題