除了rails活动记录验证中的错误消息之外,还有办法返回错误代码吗?

And*_*ang 13 validation activerecord ruby-on-rails error-code

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

bill: {
    error_code: 101,
    error_message: "msisdn can't be null"
}
Run Code Online (Sandbox Code Playgroud)

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

jve*_*zia 8

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

class Person < ActiveRecord::Base
 validates :name, presence: true
end

person = Person.new
person.valid?
person.errors.details
# => {name: [{error: :blank}]}
Run Code Online (Sandbox Code Playgroud)

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

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


Bil*_*han 4

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

例如,使用自定义验证器添加错误代码

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
Run Code Online (Sandbox Code Playgroud)

然后使用它

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
Run Code Online (Sandbox Code Playgroud)

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