除了rails活动记录validation中的错误消息之外,还有一种方法可以返回错误代码吗?

在rails activerecordvalidation中,通常如果validation失败,它将在模型的errors属性中添加错误消息,但是我们的客户端要求除了错误消息之外还返回错误代码,例如,我们有一个Bill模型,它具有一个msisdn属性,如果msisdn为null,则错误代码为101,如果msisdn不投诉MSISDN格式,则错误代码为102,当客户端通过REST接口提交请求时,如果validation失败,我们应该返回一个像json的对象

bill: { error_code: 101, error_message: "msisdn can't be null" } 

除了错误消息之外,有没有办法告诉activerecord生成错误代码? 非常感谢。

errors只是一个普通的哈希,键表示有错误的属性,值表示错误消息。 因此,从技术上讲,您可以通过使用哈希替换文本消息来实现您的要求。 但缺点是您可能需要做更多的事情以新格式显示错误。

例如,使用自定义validation程序添加错误代码

 class Foo < ActiveRecord::Base attr_accessible :msiisnd validate :msiisdn_can_not_be_blank def msiisdn_can_not_be_blank if msiisdn.blank? errors.add(:msiisdn, {code: 101, message: "cannot be blank"}) end end end 

然后使用它

 foo = Foo.new foo.errors.count #=> 0 foo.valid? #=> false foo.errors.count #=> 1 foo.errors[:msiisdn] #=> [{ code: 101, message: "can not be blank"}] foo.errors[:msiisdn][0][:code] #=> 101 

所以你可以使用它。 但是当你需要正确显示错误时,你需要做更多的工作,比如在表单中显示错误,因为这不是一个约定。

Rails 5将包含与foo.errors.details类似的function。 您可以轻松地使用它来构建更好的api错误。

 class Person < ActiveRecord::Base validates :name, presence: true end person = Person.new person.valid? person.errors.details # => {name: [{error: :blank}]} 

如果您更喜欢代码错误作为数字,则可以轻松地将数字与错误键匹配。

对于Rails 3和4,你可以使用这个gem https://github.com/cowbell/active_model-errors_details女巫是向后移植的完全相同的function。

Rails 5+或Rails 4和active_model-errors_details gem:

 class User include ActiveModel::Model validate :forbid_special_email attr_accessor :email private def forbid_special_email errors.add(:email, 'is forbidden', code: 1234) if email == 'john@example.com' end end user = User.new(email: 'john@example.com') user.validate user.errors.full_messages # ["Email is forbidden"] user.errors.details # {:email=>[{:error=>"is forbidden", :code=>1234}]}