我有EmailContact
验证,如下所示:
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?
会返回错误,而不是像我预期的那样返回false。我正在使用valid_email
gem在模型上进行验证。
答案 0 :(得分: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?
。
答案 1 :(得分:0)
您应该使用#new
,然后直接致电#save
。
email_contact = EmailContact.new(params)
if !email_contact.save
phone_contact = PhoneContact.create(params)
end