2014-02-24 70 views
1

我有一個驗證EmailContact,就像這樣:Ruby on Rails驗證 - 如果模型無效,那麼?

class EmailContact < ActiveRecord::Base 
    validates :email, :presence => true, :email => {:message => I18n.t('validations.errors.models.user.invalid_email')}, 
      :mx => {:message => I18n.t('validations.errors.models.user.invalid_mx')} 
end 

在這裏,我驗證EmailContact.email

然後,我有一個PhoneContact沒有驗證:

class PhoneContact < ActiveRecord::Base 
end 

我想寫的東西是這樣的:

email_contact = EmailContact.create(params) 

if email_contact.invalid? 
    phone_contact = PhoneContact.create(params) 
end 

基本上,如果email_contact不能創建由於驗證錯誤,我應該創建一個phone_contact。這怎麼可能?

這是我已經試過:

contact = EmailContact.create(:email => 'a') 
     (0.3ms) BEGIN 
     (0.4ms) ROLLBACK 
    ArgumentError: cannot interpret as DNS name: nil 

    contact.invalid? 
    NoMethodError: undefined method `invalid?' for nil:NilClass 

contact剛剛返回nil在這種情況下...

編輯

這可能是這個問題需要去不同的方向。僅供參考:

email_contact = EmailContact.new(:email => 'a') 
email_contact.valid? 
ArgumentError: cannot interpret as DNS name: nil 

email_contact.valid?返回一個錯誤,而不是返回爲我所期望的假。我正在使用valid_email寶石來對模型進行驗證。

+0

聽起來像mx驗證是導致此問題的原因之一,因爲它無法從您傳遞它的無效電子郵件地址獲取主機或IP地址。 – Hesham

+0

正確。我認爲問題在於如何進行驗證。我正在使用gem'valid_email'。即使執行email_contact = EmailContact.new(:email =>'a')'並運行'email_contact.valid?'也會引發同樣的錯誤。它不返回true或false,它拋出'不能解釋爲DNS名稱:nil'錯誤。 – Luigi

+1

你想做mx驗證嗎?這聽起來對我來說太過分了。如果你刪除該部分,它會正常工作。 – Hesham

回答

0

您應該使用#new,然後直接撥打#save

email_contact = EmailContact.new(params) 

if !email_contact.save 
    phone_contact = PhoneContact.create(params) 
end 
+0

我也試過這個,但是'!email_contact.save'會拋出一個錯誤,並且不會執行其中的代碼塊。 – Luigi

1

使用invalid?方法,你可以做這樣的事情:

email_contact = EmailContact.new(params) 

if email_contact.invalid? 
    phone_contact = PhoneContact.create(params) 
else 
    email_contact.save 
end 

在你的情況,你所用email_contact = EmailContact.create(params)。如果創建失敗

email_contact將被設置爲nil,你會不會能夠調用invalid?一個nil對象。 在創建數據庫中的記錄之前檢查invalid?