只有当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',则错误消失,我无法理解为什么会发生这种情况。
我非常感谢任何帮助。谢谢你们。
答案 0 :(得分:0)
不要在B类中验证A类。
我将验证B类中是否存在关系,然后使用validates_associated
(described 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