require 'active_record/validations'
class Email
attr_accessor :name, :email
attr_accessor :errors
def initialize(*args)
# Create an Errors object, which is required by validations and to use some view methods.
@errors = ActiveRecord::Errors.new(self)
end
# Required method stubs
def save
end
def save!
end
def new_record?
false
end
def update_attribute
end
# Mix in that validation goodness!
include ActiveRecord::Validations
# Validations! =)
validates_presence_of :name
validates_format_of :email, :with => SOME_EMAIL_REGEXP
end
class Person
include ActiveModel::Validations
attr_accessor :first_name, :last_name
validates_each :first_name, :last_name do |record, attr, value|
record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
end
end
2条答案
按热度按时间iszxjhcz1#
最好的方法是将伪模型 Package 在一个类中,并在其中添加验证。Rails的方式规定,不应该将模型行为放在控制器上,唯一的验证应该是与请求本身一起的验证(身份验证、授权等)。
在Rails 2.3+中,你可以包含
ActiveRecord::Validations
,但有一个小缺点,那就是你必须定义ActiveRecord层需要的一些方法。请参见this post以获得更深入的解释。下面的代码改编自该帖子:在Rails3中,您可以随意使用这些sexy validations:)
i1icjdpr2#
对于Rails 3+,应该使用
ActiveModel::Validations
将Rails样式的验证添加到常规Ruby对象。从the docs开始:
活动模型验证
为对象提供完整的验证框架。
最小实现可以是:
它为您提供了从Active Record了解到的完整标准验证堆栈:
请注意,
ActiveModel::Validations
会自动将errors方法添加到使用新的ActiveModel::Errors
对象初始化的示例中,因此您无需手动执行此操作。