2013-02-21 101 views
3

这是一个两部分问题。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 

只是柜面你想看到前方太 的感谢!

回答

7

你不需要加载ActiveModel包括::验证

我的偏好,以保持验证对象模型中的文件夹中。

所以对模型的性别你有一个文件gender.rb

对于GenderValidator您在模型文件夹中有文件gender_validator.rb

所以这两个文件一起现场验证。

这里是我的通讯模式

class NewsletterValidator < ActiveModel::Validator 
    def validate(record) 
     if record.send_test_email 
     if test_email_address.blank? 
      record.errors[:test_email_address] << "Test email address is blank" 
     end 
     if record.send_email_to_subscribers 
      record.errors[:send_test_email] << "You cannot send a test and send to subscribers at the same time" 
     end 
     end 

    end 
end 

在我的通讯模型验证我只是有

validates_with NewsletterValidator 

你在你的例子

你有

有拼写错误
class GenderValidator < ActiveModel::validator 

它应该是

class GenderValidator < ActiveModel::Validator 

注资本V

+0

感谢的人!:D,那是一些非常有用的信息 – TheLegend 2013-02-26 06:55:33