Ruby on rails 我可以确定Rails中验证错误消息的顺序吗?

Ruby on rails 我可以确定Rails中验证错误消息的顺序吗?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我希望验证消息的顺序与表单上的顺序相同 我们有三个班: class User accepts_nested_attributes_for :pledges end class Pledge accepts_nested_attributes_for :companies validates_presence_of :pledgor_surname end class Company validates_presence_of :name end 在一种形式中,我们可能需要为

我希望验证消息的顺序与表单上的顺序相同

我们有三个班:

class User
  accepts_nested_attributes_for :pledges
end

class Pledge
  accepts_nested_attributes_for :companies
  validates_presence_of :pledgor_surname
end

class Company
  validates_presence_of :name
end
在一种形式中,我们可能需要为所有三个属性获取属性,因此我们得到如下参数:

{"pledges_attributes"=>
  {"0"=>
    {"pledgor_surname"=>"",
     "id"=>"230",
     "companies_attributes"=>
      {"0"=>
        {"id"=>"125", 
         "name"=>""
        }
      }
    }
  }
}
当我调用
@user.update(params)
时,正如我所期望的那样,验证失败。但是
errors#full_messages
列表如下所示:

["Company name can't be blank", "Pledgor surname can't be blank"]`
错误以相同的顺序出现在页面上


除了对messages对象进行黑客攻击之外,有没有一种方法可以告诉Rails将消息放在哪个顺序中,或者至少应该先处理哪种质权人错误和公司错误?

没有,它们以散列形式返回,而散列不提供可靠的顺序。这可以被覆盖,这通常是通过将文件添加到lib文件夹并在rails配置中指定覆盖来完成的


编辑根据以下自Ruby 1.9.3以来的评论,哈希实际上是有序的,所以忽略我说的

#full_消息将错误转换为一个数组,但在此之前,它们位于一个类似散列的对象中(请参阅
errors[]
)。因此,您可以使用
errors.values_at(:name,:姓氏)。展平
以与给定键相同的顺序获取错误。请注意,这是非常古老的Rails 3.x验证样式。Rails 4+根据使用验证:sensor_姓氏,presence:true
。您可以按特定顺序提取哈希值。你到底建议@Arepo“重写”什么?另外,
Hash
是可靠排序的,因为1.9.3我不知道,多亏了这些信息,我最近才与Go合作,它被有意地洗牌,以防止任何人混淆它的顺序。我将更新我的答案或删除它,如果可能的话。