通过简单的验证,Rails验证失败

时间:2014-03-20 18:30:13

标签: validation activerecord ruby-on-rails-4

只有当A类的属性'need_name'为真时,我才需要验证B类的'name'属性。但是我在验证方面遇到了麻烦。

我的代码:

class A
    validates :need_name, presence: true
end

class B
    validates :name, :presence => :need_name?

    belongs_to :a

    def need_name?
        A.find(a).need_name
    end
end

我的测试:

describe A do
    context "validations" do
        it { should validate_presence_of :need_name }
    end
end

describe B do
    context "validations" do
        it { should validate_presence_of :name }
    end
end

A级的测试工作正常,但是当我进行B级测试时,我收到了这个错误:

ActiveRecord::RecordInvalid:Validation failed: Need name can't be blank

如果我设置为'need_name',则错误消失,我无法理解为什么会发生这种情况。

我非常感谢任何帮助。谢谢你们。

2 个答案:

答案 0 :(得分:0)

不要在B类中验证A类。

我将验证B类中是否存在关系,然后使用validates_associateddescribed here)来触发A上的验证。

class A
    validates :need_name, presence: true
end

class B
    belongs_to :a
    validates_presence_of :a
    validates_associated :a
end

在上面的代码中,只有关联的实例通过验证(即设置了need_name),才会验证是否与存在的A类实例存在关联。 / p>

答案 1 :(得分:0)

解决方案是将验证的方式更改为:

class A
    validates :need_name, inclusion: { in: [true, false] }
end

class B
    validates :name, :presence => { if: :need_name? }
    belongs_to :a

    def need_name?
        a.need_name unless a.blank?
    end
end