3

私が構築している現在のアプリでは、ユーザーがメールアドレスのカンマ区切りのリストを入力するテキストエリアがあります。

現在、リストを配列に分割してから、1つずつ保存しています。しかし、たとえば、この入力がある場合...

blah@example.com、test@example、foo@example.com

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

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

前もって感謝します!

4

4 に答える 4

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

これにより、検証エラー + 必要に応じてビューにアクセスできるようにする無効な電子メール アドレスの配列が提供されます。

于 2009-03-24T00:59:57.053 に答える
0

ruby にはここで説明されている分割機能 (.each) があり、ここで説明されているように正規表現をサポートしています

そのため、文字列を (区切り文字として「,」を使用して) 分割し、正規表現を使用して各電子メールを検証します。

于 2009-03-23T21:31:47.133 に答える
0

保存メールをトランザクションに入れることができます。次に、いずれかの保存が失敗した場合、以前の保存はすべてキャンセルされます。このような場合、検証はモデル レイヤーでのみ実行できます。

それは明確なコードだと思いますが、確かに最速の方法ではありません (しかし、Ruby を使用するということは、高速な方法でさえ実行していないことを意味します;))

于 2009-03-23T21:47:24.850 に答える
-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\.%\+\-]+@(?:[A-Z0-9\-]+\.)+(?:[A-Z]{2,}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|jobs|museum)/i }.nil?
     end

編集:実際には、この正規表現を使用したいだけかもしれません。これは、restful-authentication プラグインから取得されました。

于 2009-03-23T21:31:03.843 に答える