Ruby on rails RubyonRails验证-如果模型无效,那么?
我有一个带有验证的Ruby on rails RubyonRails验证-如果模型无效,那么?,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,我有一个带有验证的电子邮件联系人,如下所示: class EmailContact < ActiveRecord::Base validates :email, :presence => true, :email => {:message => I18n.t('validations.errors.models.user.invalid_email')}, :mx => {:message => I18n.t('validation
电子邮件联系人
,如下所示:
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
我想写这样的东西:
email_contact = EmailContact.create(params)
if email_contact.invalid?
phone_contact = PhoneContact.create(params)
end
基本上,如果由于验证错误而无法创建电子邮件联系人
,我应该创建一个电话联系人
。这怎么可能
这就是我尝试过的:
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\u contact.valid?
返回一个错误,而不是像我预期的那样返回false。我正在使用valid\u电子邮件gem对模型进行验证。您应该使用\new
然后直接调用\save
email_contact = EmailContact.new(params)
if !email_contact.save
phone_contact = PhoneContact.create(params)
end
使用无效?
方法,可以执行以下操作:
email_contact = EmailContact.new(params)
if email_contact.invalid?
phone_contact = PhoneContact.create(params)
else
email_contact.save
end
在您的案例中,您使用了email\u contact=EmailContact.create(params)
如果创建失败,您将无法对nil
对象调用invalid?
,则email\u contact
将设置为nil
。
在数据库中创建记录之前,请检查是否无效?
我也试过了,但是!电子邮件\u contact.save
会引发错误,并且不会在中执行代码块。听起来mx验证是导致此问题的原因,因为它无法从您传递的无效电子邮件地址中获取主机或ip地址。正确。我认为问题在于如何进行验证。我使用的是一封gem有效的电子邮件
。即使执行email\u contact=EmailContact.new(:email=>a')
并运行email\u contact.valid?
也会抛出相同的错误。它不会返回true或false,它会抛出无法解释为DNS名称:nil
错误。是否要执行mx验证?对我来说,这听起来像是杀伤力过大。如果你删除了那个部分,它会工作的很好。有效的,mx验证可能是杀伤力过大-我可能会删除它,现在使用下面的一个答案,如果我需要的话,也许我可以考虑稍后把它带回来。谢谢你的帮助。
email_contact = EmailContact.new(params)
if email_contact.invalid?
phone_contact = PhoneContact.create(params)
else
email_contact.save
end