这是一个两部分问题。Rails在哪里放置您的Activemodel ::验证器
第一部分如果我的模型,我正在写验证是继承ActiveRecord::Base
我需要在该类内include ActiveModel::Validations
?轨道的API不说但是这里在yehudakatz博客似乎暗示?
第二部分是放哪些验证器文件的最佳位置?在助手下或作为一个新的模型或在lib中?
我目前的验证看起来像这样
class GenderValidator < ActiveModel::validator
def validate(record)
cred = /(\d{6})(\d{4})(\d{1})(\d{2})/.match(record.id_number.to_s) #breaks up the id into the relevent sections namely birthdate, gender, nationality, validator.
unless cred[0][/\d{13}/] #checks to see if the id is a valid length of numbers if it isnt then skip the validation of gender
return true
else
birthdate = cred[1] #returns a 6 digit string 'yymmdd'
parsed_gender = cred[2] #returns a 4 digit string '0001-4999:female 5000-9999:male'
nationality = cred[3] # should return either a 1 or a 0 1 if the person is foreign or 0 if the person is southafrican
validate_gender(parsed_gender, record)
end
end
private
def validate_gender(parsed_gender, record)
calculate_gender = (parsed_gender <= 4999 ? :female : :male)
unless employee.gender == calculate_gender
employee.errors[:gender] << "Your id indicates you have entered the wrong gender"
end
end
end
每个人的有效身份证件数是可选的,但如果他们这样做指定它应该检查是否性别是正确的。
如果我把它在同一个模型员工模型,然后我得到这个错误
ActionController::RoutingError (uninitialized constant Employee::GenderValidator):
app/models/employee.rb:25:in `<class:Employee>'
app/models/employee.rb:1:in `<top (required)>'
lib/role_requirement_system.rb:19:in `inherited'
app/controllers/employees_controller.rb:1:in `<top (required)>'
librato-rails (0.8.1) lib/librato/rack/middleware.rb:12:in `call'
,所以我把它他们不能在同一个文件中。验证的最佳做法是什么?我观看了所有的栏杆,我已经阅读了一些博客,而且我还是很新的。
编辑
在我的模型包括我这个类像
include ActiveModel::Validations
和我验证这个样子
validates_presence_of :name, :position, :gender
validate :instance_validations, :on => :create
def instance_validations
validates_with GenderValidator
end
只是柜面你想看到前方太 的感谢!
感谢的人!:D,那是一些非常有用的信息 – TheLegend 2013-02-26 06:55:33