2012-03-27 41 views
0

看来Rails只会在嵌套模型的属性发生变化时验证现有的无效嵌套模型。如何通过嵌套属性验证现有的无效模型?

有如下型号:

class Person < ActiveRecord::Base 
    has_many :addresses 
    accepts_nested_attributes_for :addresses 
end 

class Address < ActiveRecord::Base 
    belongs_to :person 
    validates_presence_of :street 
end 

例如下面的代码,保存并返回true:

p = Person.first 
p.update_attributes({:first_name => "Bryan", :addresses_attributes=>{"0"=>{:street=>"", :id => 1}}) 

有没有办法来验证嵌套模式,如果它的属性已经改变? (同时保留错误)

+1

使用'save'或'save!'方法。 'update_attributes'用于特殊情况,并且(我将不得不看),但认为它不触发直接的'save'方法执行的某些检查。 – 2012-03-27 02:01:44

回答

1

它为我的作品 - 这里是我创造来证明这一点

require 'test_helper' 

class PersonTest < ActiveSupport::TestCase 

    test "update address" do 
    expected_new_address="pandascout" 
    person = Person.create(name: "jwo") 
    address = person.addresses.create(street: "123 Elm") 

    person.update_attributes({:addresses_attributes=>{"0"=>{:street=>expected_new_address, :id=>address.id}}}) 
    assert_equal expected_new_address, person.addresses.first.street 
    end 
end 

我能想到的唯一的事情是,你有一个参考,以“地址”和你一个测试用例需要重新加载它。

+0

感谢您花时间回答并创建此测试。 – deadkarma 2012-03-27 14:29:43

+0

@deadkarma肯定 - 我很好奇,这是我们可以重现结果的一种方式......您是否发现了您在寻找这个问题的内容?如果是这样,请标记为已接受 - 如果没有,请告诉我,我可以进一步深入。 – 2012-03-27 14:48:03

+0

我创建了一个全新的应用程序,它验证了嵌套模型的好处。我在我的应用程序中恢复了更早的提交,并且在那里也起作用。因此,从现在到6个月前,它必定会发生一些变化:/ – deadkarma 2012-03-27 15:04:10