在 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 应用程序中处理电子邮件异常的最佳方法是啥?

如何使用剑道验证器验证多封电子邮件?

Rails API:实现身份验证的最佳方式?

Go:连接到 SMTP 服务器并在一个连接中发送多封电子邮件?

Ruby on Rails 中身份验证的最佳解决方案 [关闭]

对多封电子邮件执行一次批处理脚本