在 Rails 中验证多封电子邮件和处理错误的最佳方法是啥?
Posted
技术标签:
【中文标题】在 Rails 中验证多封电子邮件和处理错误的最佳方法是啥?【英文标题】:What's the best way to validate multiple emails and handle errors in Rails?在 Rails 中验证多封电子邮件和处理错误的最佳方法是什么? 【发布时间】:2010-10-15 02:04:50 【问题描述】:在我正在构建的当前应用程序中,我有一个文本区域,用户将在其中输入以逗号分隔的电子邮件地址列表。
我目前正在将列表拆分为一个数组,然后一一保存。但是,如果,比如说,我有这个输入......
blah@example.com、test@example、foo@example.com
... 然后 blah@example.com 将被保存,但保存 test@example 将失败。因此,当我显示 test@example 不是有效的电子邮件地址的错误时,我需要从传递回 textarea 的逗号分隔字符串中删除 blah@example.com。
有没有更好的方法在服务器端验证这些并处理错误,而不会在控制器中变得花哨/丑陋?
提前致谢!
【问题讨论】:
【参考方案1】:假设这是一个有_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
这提供了一个验证错误 + 一个无效电子邮件地址数组,如果您愿意,您可以将其访问到您的视图中。
【讨论】:
【参考方案2】:ruby 具有 here 描述的拆分函数 (.each) 并支持 here 描述的正则表达式
因此,您将拆分字符串(使用“,”作为分隔符),然后使用正则表达式验证每封电子邮件。
【讨论】:
【参考方案3】:您可以将保存的电子邮件放入事务中。然后,如果任何保存失败,则所有之前的保存都将被取消。在这种情况下,只能在模型层上进行验证。
我认为这将是清晰的代码,但可以肯定它不是最快的方式(但使用 Ruby 意味着您不会以更快的方式执行它;))
【讨论】:
【参考方案4】:如果您将它们放在一个名为 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 插件。
【讨论】:
以上是关于在 Rails 中验证多封电子邮件和处理错误的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Postmarkapp 在 Rails 应用程序中处理电子邮件异常的最佳方法是啥?
Go:连接到 SMTP 服务器并在一个连接中发送多封电子邮件?