Rails 4中非持久模型的自定义验证

时间:2016-05-10 16:59:30

标签: ruby-on-rails validation ruby-on-rails-4 activemodel

在读完(几乎)所有互联网后,我需要你输入这个问题。

上下文 我有non persisted Rails 4 model使用ActiveModel::Model根据其文档包含ActiveModel::Validations

代码:

class GoodnessValidator < ActiveModel::Validator
  def validate(record)
    if record.first_name == "Evil"
      record.errors[:base] << "This person is evil"
    end
  end
end

class Person
  include ActiveModel::Model
  include ActiveModel::Validations

  validates_with GoodnessValidator
  attr_accessor :first_name
end

问题: 当我创建一个新的Person作为p = Person.new(first_name: 'Evil')时,应该验证这是一个“邪恶的人”。所以,我希望像p.errors这样的错误访问器应该返回Hash并包含所有错误。

但是,总是空的,p.errors不会返回任何内容。决不。

[102] pry(main)> p = Person.new(first_name: 'Evil')
=> #<Person:0x007fa0925809f0 @first_name="Evil">
[103] pry(main)> p.errors
=> #<ActiveModel::Errors:0x007fa09173ac88 @base=#<Person:0x007fa0925809f0 @errors=#<ActiveModel::Errors:0x007fa09173ac88 ...>, @first_name="Evil">, @messages={}>
[104] pry(main)> p.errors.full_messages
=> []
[105] pry(main)>

1 个答案:

答案 0 :(得分:2)

保存模型时通常会触发验证。在您的情况下,您需要手动运行它们,然后检查错误:

p = Person.new(first_name: 'Evil')
unless p.valid? # runs the validations
  puts inspect p.errors
end