2011-07-27 90 views
2

使用Rails 3.1,我有:爲什麼不更新這個模型觸發驗證?

class Status < ActiveRecord::Base 
    has_many :participations, :dependent => :destroy 
    has_many :users, :through => :participations 

    validates :users, :presence => true 
end 

在我的單元測試,我做的:

user = User.create(:name => "Bob") 
status1 = Status.create(:description => "available") 
user.statuses << status1 

,並得到:

的ActiveRecord :: RecordInvalid:驗證失敗:用戶可以不可空白

但是,如果不是最後一個li ne我:

status1.users << user 

它工作正常。

爲什麼驗證被觸發爲:

user.statuses << status1 

UPDATE:

測試完全

test "Return all statuses associated with the manager" do 
    manager = Manager.create(:email => "[email protected]", :password => "password", :password_confirmation => "password") 

    workshop = Workshop.create(:name => "Bob Autos") 
    manager.workshop = workshop 
    manager.save 

    user = User.create(:name => "a customer") 

    workshop.users << user 

    status1 = Status.create(:description => "Car is ready") 
    status2 = Status.create(:description => "problem with exhaust") 
    status3 = Status.create(:description => "parts delivered") 

    user.statuses << status1 
    user.statuses << status2 

    assert_equal([status1, status2], manager.statuses) 

    user.statuses << status3 

    assert_equal([status1, status2, status3], manager.statuses) 
    end 

回答

2

驗證結果爲Status,而不是User。模型的驗證僅在更新模型時觸發,並且您沒有實際更新User模型(因爲statuses是關聯而不是字段)。

如果你想要一個對象上驗證來觸發另一個驗證,你應該使用validates_associated

class Status 
    validates_associated :users 
end 

(在一個相關的說明,但是,爲什麼一個狀態有許多用戶似乎是一個狀態應該只有一個用戶。)

+0

謝謝約翰,這有幫助,但爲什麼驗證「用戶不能爲空」甚至被觸發那裏?因爲我正在爲用戶分配狀態。如果驗證錯誤發生在實際創建狀態時,我想我會不會感到驚訝。這是故意的:-)我的應用程序將允許共享狀態。 – pingu

1

因爲status1.users集合時沒有自動更新你做user.statuses << status1

+0

感謝您的答覆,那麼爲什麼收集沒有得到更新導致驗證獲得觸發? – pingu

+0

@pingu你可以發佈你的測試完整的代碼嗎? – Ant

+0

更新的問題,謝謝。 – pingu

相關問題