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

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

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

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

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

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

提前致谢!

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

这会提供validation错误+无效电子邮件地址的数组,如果您愿意,可以访问这些地址。

ruby有一个这里描述的split函数(.each),它支持如此处所述的正则表达式

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

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

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

如果你将它们放在一个名为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\-]+\.)+(?:[AZ]{2,}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|jobs|museum)/i }.nil? end 

编辑:实际上你可能只想使用这个正则表达式。 它取自restful-authentication插件。