在Rails中验证多个电子邮件和处理错误的最佳方法是什么?

时间:2009-03-23 21:18:33

标签: ruby-on-rails ruby email email-validation

在我正在构建的当前应用程序中,我有一个textarea,用户将在其中输入以逗号分隔的电子邮件地址列表。

我目前正在将列表拆分为数组,然后逐个保存。但是,如果,我有这个意见......

blah@example.com,test @ example,foo @ example.com

...然后将保存blah@example.com,但保存测试@示例将失败。因此,当我显示test @ example不是有效电子邮件地址的错误时,我需要从逗号分隔的值字符串中删除blah@example.com,并将其传递回textarea。

有没有更好的方法在服务器端验证这些并处理错误而不会在控制器中获得幻想/丑陋?

提前致谢!

4 个答案:

答案 0 :(得分:3)

假设这是一个包含大量电子邮件的模型,并且电子邮件模型使用: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 :(得分:0)

ruby​​有一个分割函数(.each)描述here并且支持如here所述的正则表达式

因此,您将拆分字符串(使用“,”作为分隔符),然后使用正则表达式验证每封电子邮件。

答案 2 :(得分:0)

您可以将保存电子邮件放入交易中。然后,如果任何保存失败,则取消所有预设保存。在这种情况下,只能在模型层上进行验证。

我认为这将是明确的代码,但肯定它不是最快的方式(但使用Ruby意味着你没有以更快的方式做到这一点;)

答案 3 :(得分:-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插件。