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

3
在我正在开发的应用程序中,我有一个文本区域,用户将在其中输入逗号分隔的电子邮件地址列表。
我目前将列表拆分为数组,然后逐个保存。但是,如果我有以下输入...
blah@example.com, test@example, foo@example.com
那么blah@example.com将被保存,但保存test@example将失败。因此,当我显示test@example不是有效电子邮件地址的错误时,我需要从逗号分隔的值字符串中删除blah@example.com。
有没有更好的方法在服务器端验证这些内容并处理错误,而不需要在控制器中变得花哨/丑陋?
提前感谢!
4个回答

3
假设这是一个模型,其中包含多个电子邮件(has_many emails),并且电子邮件模型使用了 :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

这将提供一个验证错误和一组无效的电子邮件地址,如果需要,您可以使其在视图中可访问。

0

在 Ruby 中有一个拆分函数(.each)的描述 这里,并支持正则表达式的描述 这里

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


0

您可以将保存电子邮件放入事务中。如果任何保存失败,则取消所有先前的保存。在这种情况下,验证只能在模型层上完成。

我认为这将是清晰的代码,但肯定不是最快的方式(但使用Ruby意味着您甚至不会以更快的方式执行它;))


-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插件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接