2012-03-27 29 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