通过JSON嵌套创建 - 在嵌套模型上进行验证

时间:2013-04-11 05:41:57

标签: ruby-on-rails ruby json ruby-on-rails-3

我有两个简单的模型:

class Idea << ActiveRecord::Base
  has_many :tasks

  # for nesting....
  accepts_nested_attributes_for for :tasks
  attribute_accessible :tasks_attributes
end

class Task << ActiveRecord::Base
  belongs_to :idea
  validates_presence_of :idea # this line is causing pain
end

我发送以下JSON来创建我的IdeasController:

{
    "description":"Test test test",
    "tasks":[{"description":"test test test"}]
}

...我得到了验证错误。一旦我删除验证,一切顺利!

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

定义反向关联有助于:

class Idea << ActiveRecord::Base
  has_many :tasks, inverse_of: :idea # here...
  accepts_nested_attributes_for :tasks
  attribute_accessible :tasks_attributes
end

class Task << ActiveRecord::Base
  belongs_to :idea, inverse_of: :tasks # ... and here
  validates_presence_of :idea 
end

验证失败的原因是,在此修复之前,关联是单向的:当您尝试到达任务的idea时,而不是使用用于通过其想法完成任务的关联代理,它会创建另一个没有意识到这个想法存在的协会代理(抱歉,这有点难以解释)。

另外,请务必使用validates_presence_of :idea而不是validates_presence_of :idea_id。此外,您应该在json中使用tasks_attributes而不是tasks