在rails中重构验证逻辑和正则表达式的最佳方法是什么?

时间:2011-05-10 02:20:05

标签: ruby-on-rails ruby regex validation refactoring

假设您有多个模型包含地址,邮政编码,省/国家/地区,电话号码等字段。

这些是具有特定正则表达式验证的相当常见的字段。如果在每个模型中放置相同的验证和正则表达式,则会重复。此外,测试是重复的。这是一种气味;)

使用ruby和rails重构这些类型的东西的最佳方法是什么?一个模块?

在使用Hibernate的Java中,我们使用Component类来存储地址,然后我们将验证逻辑放在那里。想要使用地址的每个模型只包含一个,它将获得所有地址验证逻辑。

在rails中实现相同功能的方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

为您需要的各种类型的验证构建自定义验证器,然后在模型类中调用它们。

例如:

class PostalCodeValidator < ActiveModel::EachValidator
  def validate_each(record, attr_name, value)
    unless value =~ /^\d{5}$/
      record.errors[attr_name] << "must be a 5-digit postal code"
    end
  end

现在在每个模型类和邮政编码的每个属性中使用该验证。例如,如果您的Customer有一个属性postal_code:

class Customer < ActiveRecord::Base
  validates :postal_code, :postal_code => true
end

有更多细节和许多花哨的选项,所以我建议在rails自定义验证器上进行谷歌搜索。