【问题标题】: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。

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

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby email email-validation


    【解决方案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 插件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-05
            • 2011-06-14
            • 1970-01-01
            • 2021-06-16
            • 1970-01-01
            • 1970-01-01
            • 2019-02-10
            相关资源
            最近更新 更多