3

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

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

blah@example.com、test@example、foo@example.com

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

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

提前致谢!

4

4 回答 4

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

这提供了一个验证错误 + 一组无效的电子邮件地址,如果您愿意,您可以将其访问到您的视图中。

于 2009-03-24T00:59:57.053 回答
0

ruby 具有此处描述的拆分函数 (.each)并支持此处描述的正则表达式

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

于 2009-03-23T21:31:47.133 回答
0

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

我认为这将是清晰的代码,但可以肯定它不是最快的方式(但使用 Ruby 意味着你没有以更快的方式进行操作;))

于 2009-03-23T21:47:24.850 回答
-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 插件。

于 2009-03-23T21:31:03.843 回答