【问题标题】:how to check if email exists from object errors array Rails如何检查对象错误数组Rails中是否存在电子邮件
【发布时间】:2011-08-22 07:47:55
【问题描述】:

我正在通过电子邮件创建用户。 如果存在电子邮件,我想跳过创建该用户。

这是我的模型方法:

def invite_users(emails, board)
      invalid_emails =[]
      emails.each do |email| 
        user = User.new(:email => email)
          user.save ? Participant.make(user, board) : invalid_emails << email unless user.errors.each {|key, msg| msg == "has already been taken"}
      end
       invalid_emails if invalid_emails.any?
  end

我想检查从 user.save 生成​​的错误是否是重复的电子邮件错误。如果是这样,我不想将该电子邮件放入 invalid_emails 数组中。

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails-3 validation


    【解决方案1】:

    validates_uniqueness_of 对此类用途毫无用处。

    规范的做法是将电子邮件的唯一索引添加到用户表中,并使用如下代码:

    begin
      -- do stuff that creates records --
    rescue ActiveRecord::StatementInvalid => e
      raise unless /Mysql::Error: Duplicate entry/.match(e)  
    end
    

    如果你想模拟 create 或 find,你可以这样做

     result = nil
     begin
       result = User.create(:email => xxxx)
     rescue ActiveRecord::StatementInvalid => e
       if /Mysql::Error: Duplicate entry/.match(e)
         user = User.find_by_email(xxx)
       else
         raise
       end
     end
    

    【讨论】:

    • 感谢您的回复。如果我要使用 Postgres,重复错误会是 Postgres::Error:Duplicate?
    【解决方案2】:

    改变一下

    user = User.new(:email => email)
    user.save ? Participant.make(user, board) : invalid_emails << email unless user.errors.each {|key, msg| msg == "has already been taken"}
    

    user = User.new(:email => email)
    if User.find_by_email( email ).blank? 
      Participant.make(user, board)
    else
      invalid_emails << email 
    end
    

    【讨论】:

      【解决方案3】:

      由于errors 基本上是一个数组,您只需将each 更改为any 即可获得符合您条件的布尔值。

      【讨论】:

        猜你喜欢
        • 2021-10-14
        • 1970-01-01
        • 2011-06-03
        • 2011-06-07
        • 2019-11-02
        • 1970-01-01
        • 2013-01-05
        • 2016-12-06
        • 2016-08-20
        相关资源
        最近更新 更多