我想要实现的是获得失败的验证类型。它是空白的吗?重复?长度?
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"
}]
}
答案 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
来获取实际的回复内容。