我在我的一個Rails模型中使用了accep_nested_attributes_for,並且我想在創建父項之後保存子項。accep_nested_attributes_for兒童關聯驗證失敗
表單完美,但驗證失敗。爲了簡便起見設想以下:
class Project < ActiveRecord::Base
has_many :tasks
accepts_nested_attributes_for :tasks
end
class Task < ActiveRecord::Base
belongs_to :project
validates_presence_of :project_id
validates_associated :project
end
而且我運行:
Project.create!(
:name => 'Something',
:task_attributes => [ { :name => '123' }, { :name => '456' } ]
)
在節能項目模型,驗證失敗的任務,因爲他們沒有一個PROJECT_ID(因爲項目尚未保存)。
好像Rails正在按以下模式:
- 驗證項目
- 驗證任務
- 保存項目
- 保存任務
的模式應該是:
- 驗證項目
- 傳給:保存項目,並繼續...
- 驗證任務
- 傳給:保存任務
- 在失敗:刪除項目(也許回滾?)
所以我的問題歸結爲:我怎樣才能讓Rails運行project_id =(或project =)方法和父對象之後的子任務(任務)驗證(項目)已保存,但如果任何子項(任務)無效,則不保存父項(項目)模型?
任何想法?
這並沒有爲我工作。在validates_presence_of中:project_id調用'project'返回nil,導致它嘗試驗證project_id並使驗證失敗。我創建了另一個問題,因爲我認爲問題是不同的,但它似乎是相同的http://stackoverflow.com/questions/2102724/rails-nested-attributes-association-validation-failing。 – 2010-01-20 18:11:16
對於Rails 3.0和更高版本,下面的inverse_of解決方案更加正確。 – nertzy 2011-10-18 17:26:54