All*_*ate 3 validation module ruby-on-rails ruby-on-rails-3
我正在尝试将我的验证移到模块中.我想将现有对象扩展为一组非常有效的验证器,但我正在努力弄清楚如何让它们执行.有任何想法吗?
活动记录对象
class Test < ActiveRecord::Base
has_many :resources
end
Run Code Online (Sandbox Code Playgroud)
验证器
module TestValidator
extend ActiveSupport::Concern
included do
validates_associated :resources
end
end
Run Code Online (Sandbox Code Playgroud)
安慰
t = Test.new
t.extend TestValidator
t.valid?
# true ... should be false
Run Code Online (Sandbox Code Playgroud)
我希望这可以提供帮助
6.1自定义验证器自定义验证器是扩展ActiveModel :: Validator的类.这些类必须实现一个validate方法,该方法将记录作为参数并对其执行验证.使用validates_with方法调用自定义验证程序.
class MyValidator < ActiveModel::Validator
def validate(record)
unless record.name.starts_with? 'X'
record.errors[:name] << 'Need a name starting with X please!'
end
end
end
class Person
include ActiveModel::Validations
validates_with MyValidator
end
Run Code Online (Sandbox Code Playgroud)
添加自定义验证器以验证单个属性的最简单方法是使用方便的ActiveModel :: EachValidator.在这种情况下,自定义验证器类必须实现validate_each方法,该方法接受三个参数:记录,属性和值,它们对应于实例,要验证的属性以及传递的实例中的属性值.
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
record.errors[attribute] << (options[:message] || "is not an email")
end
end
end
class Person < ActiveRecord::Base
validates :email, :presence => true, :email => true
end
Run Code Online (Sandbox Code Playgroud)
如示例所示,您还可以将标准验证与您自己的自定义验证器结合使用.
http://guides.rubyonrails.org/active_record_validations_callbacks.html#performing-custom-validations
| 归档时间: |
|
| 查看次数: |
2526 次 |
| 最近记录: |