首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails放置Activemodel::validators的位置

Rails放置Activemodel::validators的位置
EN

Stack Overflow用户
提问于 2013-02-21 19:41:01
回答 1查看 1.5K关注 0票数 3

这是一个由两部分组成的问题。

第一部分如果我正在为其编写验证的模型是来自ActiveRecord::Base的,我需要在该类中使用include ActiveModel::Validations吗?rails的API没有说,但在yehudakatz博客中似乎暗示了这一点?

第二部分是将这些验证器文件放在哪里最好?在helpers下,或者作为新模型,或者在lib中?

我当前的验证器如下所示

代码语言:javascript
复制
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

每个人的有效身份证号是可选的,但如果他们指定了它,它应该检查性别是否正确。

如果我将其保持在与员工模型相同的模型中,则会得到以下错误

代码语言:javascript
复制
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'

所以我认为它们不可能在同一个文件中。验证的最佳实践是什么?我看过所有rails的演员阵容,也读过一些博客,我还是个新手。

编辑

在我的模型中,我包含了这个类,比如

代码语言:javascript
复制
include ActiveModel::Validations

我的验证如下所示

代码语言:javascript
复制
validates_presence_of :name, :position, :gender
validate :instance_validations, :on => :create

def instance_validations
  validates_with GenderValidator    
end

只是为了以防万一你也想看看这个,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-26 00:09:06

您不需要包含ActiveModel::Validations

我的偏好是将验证对象保留在模型文件夹中。

因此,对于模特性别,您有一个文件gender.rb

对于验证器GenderValidator,您有文件gender_validator.rb

因此,这两个文件一起位于model文件夹中。

下面是我的时事通讯模型的验证器

代码语言:javascript
复制
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

在我的时事通讯模型中,我简单地

代码语言:javascript
复制
  validates_with NewsletterValidator

你的例子中有一个拼写错误。

你有

代码语言:javascript
复制
class GenderValidator < ActiveModel::validator

它应该是

代码语言:javascript
复制
class GenderValidator < ActiveModel::Validator

请注意大写V

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15001351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档