2011-08-22 39 views
1

我從電子郵件創建用戶。 如果存在電子郵件,我想跳過創建該用戶。如何檢查對象錯誤是否存在電子郵件數組Rails

這裏是我的模型方法:

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數組中。

我該怎麼做?

回答

0

validates_uniqueness_of是無用的這樣的目的。

的規範做的事情是對電子郵件添加唯一索引的用戶表,並使用類似的代碼:如果你想效仿創建或找到

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

,你這樣做

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 
+0

感謝您的回覆。如果我打算使用Postgres,重複的錯誤是Postgres :: Error:Duplicate? – chell

+0

不確定,還沒用過postgre。 –

0

只是改變

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 
+0

也不是併發安全 –

0

由於errors基本上是一個數組,您可以將each更改爲any以獲取您的條件的布爾值。

相關問題