Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails验证-如果模型无效,那么?_Ruby On Rails_Ruby_Validation - Fatal编程技术网

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