ActiveModel ::错误:有没有办法获取错误类型?

时间:2015-03-05 08:45:41

标签: ruby-on-rails rails-activerecord

我想要实现的是获得失败的验证类型。它是空白的吗?重复?长度?

class Film <; ActiveRecord::Base
    validates :title, :presence => true, :uniqueness => true, :length => { :maximum => 100 }
    validates :budget, :presence => true, :length => { :within => 1..10000000 }
end

我希望能够做到这一点

f = Film.create
f.errors.first.type = :presence

或类似的东西。我想这样做是为了将我的API失败的原因发送给API使用者(移动)。

{
   "errors": [{
      "code": "film_empty_title",
      "reason": "empty"
   }]
}

3 个答案:

答案 0 :(得分:0)

我发了一篇关于如何在我的博客上执行此操作的帖子: https://pgord.wordpress.com/2015/02/19/quick-bit-reason-for-activerecord-rollback-in-the-rails-console/

在你的情况下试试这个:

f = Film.create
f.errors.full_messages

答案 1 :(得分:0)

Rails 5中的这个反向端口怎么样:https://github.com/cowbell/active_model-errors_details

答案 2 :(得分:-1)

使用.errors.on

user = User.new
user.valid?
user.errors.on(:email)
  => "is not a valid email address.  Please check that you have typed or copied it correctly."
user.errors.on(:last_seen_at)
  => nil

因为这会返回一个字符串(truthy)或nil(falsy),你可以在if测试中使用它,如

if user.errors.on(:email)
  ...

在你的情况下,你想要创建一个错误的json字符串,我认为你可以简单地这样做:

json = {:errors => film.errors}.to_json

(注意我使用film而不是f作为变量名称,使用描述性名称要好得多,而“f”是按照惯例用于存储表单的变量'在表格块中)

但对我来说,这给了我(使用我的用户示例)

"{\"errors\":[[\"password_confirmation\",\"is too short (minimum is 4 characters)\"], [\"first_name\",\"is too short (minimum is 1 characters)\"], [\"last_name\",\"is too short (minimum is 2 characters)\"], [\"login\",\"can't be blank\"], [\"password\",\"is too short (minimum is 4 characters)\"], [\"email\",\"is not a valid email address.  Please check that you have typed or copied it correctly.\"]]}"

这不是你需要的 - 它将错误存储在数组而不是散列中。

试试这个:

hash = {:errors => [{}]};film.errors.each{|f,m| hash[:errors][0][f] = m};hash
然后,您可以hash.to_json来获取实际的回复内容。