验证嵌套在动态生成字段中的动态生成字段
Validating dynamically generated fields nested within a dynamically generated field
我有三个模型 Comapny
、Person
和 Role
一个公司 has_many :people
、一个人 has_many :roles
和一个公司 has_many :roles, through: :people
.这就是它变得有趣的地方:公司的人数和个人的角色是使用 cocoon 分配的,这意味着我在一组动态生成的字段中有一组动态生成的字段。
我遇到的问题是验证公司的角色。比如每个公司都需要一个总裁(role.role_name="President"
) 所以我设置如下: validation:
validate :final_incorporation
def company_validation
errors.add(:company, "needs a president") if self.roles.where(role_name: "President").count==0
end
...而且有效! ...有时。如果我注释掉验证并将带有人员和角色的公司保存到数据库中,然后将验证放回并保存。它通过了验证。
但是,如果我添加一个人,然后为该人添加 "President" 的角色并尝试提交验证,它不会通过。
我的猜测是,虽然我不知道如何绕过它,但 cocoons 为每个生成的字段分配临时 ID 的方式正在搞砸验证中指定的关联。
所以从日志来看:
这通过了验证:
..."people_attributes"=>{"0"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"0"=>{"role_name"=>"President", "_destroy"=>"false", "id"=>"5"}, "1"=>{"role_name"=>"Treasurer", "_destroy"=>"false", "id"=>"6"}}}...
但事实并非如此:
..."people_attributes"=>{"1455189047186"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"1455189059602"=>{"role_name"=>"President", "_destroy"=>"false"}, "1455189066001"=>{"role_name"=>"Treasurer", "_destroy"=>"false"}}...
编辑 这也没有通过验证(以前保存的人但添加了角色)
..."people_attributes"=>{"0"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"1455195637658"=>{"role_name"=>"President", "_destroy"=>"false"}, "1455195641046"=>{"role_name"=>"Treasurer", "_destroy"=>"false"}}...
任何关于如何解决这个问题的想法都将不胜感激。提前致谢!
def company_validation
errors.add(:company, "needs a president") unless people.any?{|person| person.roles.any?{|role| role.role_name == "President" && !role.marked_for_destruction?}}
end
我有三个模型 Comapny
、Person
和 Role
一个公司 has_many :people
、一个人 has_many :roles
和一个公司 has_many :roles, through: :people
.这就是它变得有趣的地方:公司的人数和个人的角色是使用 cocoon 分配的,这意味着我在一组动态生成的字段中有一组动态生成的字段。
我遇到的问题是验证公司的角色。比如每个公司都需要一个总裁(role.role_name="President"
) 所以我设置如下: validation:
validate :final_incorporation
def company_validation
errors.add(:company, "needs a president") if self.roles.where(role_name: "President").count==0
end
...而且有效! ...有时。如果我注释掉验证并将带有人员和角色的公司保存到数据库中,然后将验证放回并保存。它通过了验证。
但是,如果我添加一个人,然后为该人添加 "President" 的角色并尝试提交验证,它不会通过。
我的猜测是,虽然我不知道如何绕过它,但 cocoons 为每个生成的字段分配临时 ID 的方式正在搞砸验证中指定的关联。
所以从日志来看:
这通过了验证:
..."people_attributes"=>{"0"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"0"=>{"role_name"=>"President", "_destroy"=>"false", "id"=>"5"}, "1"=>{"role_name"=>"Treasurer", "_destroy"=>"false", "id"=>"6"}}}...
但事实并非如此:
..."people_attributes"=>{"1455189047186"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"1455189059602"=>{"role_name"=>"President", "_destroy"=>"false"}, "1455189066001"=>{"role_name"=>"Treasurer", "_destroy"=>"false"}}...
编辑 这也没有通过验证(以前保存的人但添加了角色)
..."people_attributes"=>{"0"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"1455195637658"=>{"role_name"=>"President", "_destroy"=>"false"}, "1455195641046"=>{"role_name"=>"Treasurer", "_destroy"=>"false"}}...
任何关于如何解决这个问题的想法都将不胜感激。提前致谢!
def company_validation
errors.add(:company, "needs a president") unless people.any?{|person| person.roles.any?{|role| role.role_name == "President" && !role.marked_for_destruction?}}
end