Ruby on Rails验证 - 如果模型无效,那么?

时间:2014-02-24 16:32:00

标签: ruby-on-rails ruby validation

我有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在模型上进行验证。

2 个答案:

答案 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