【问题标题】:DRY way to write many custom validators in rails在 Rails 中编写许多自定义验证器的 DRY 方式
【发布时间】:2012-11-19 17:56:20
【问题描述】:

在我的应用程序中,我将多个自定义验证器保存在 app/validators 中,然后调用多个模型。

我主要是为基于正则表达式的验证执行此操作,例如电子邮件、手机等,基本上是我需要采用特定格式的自定义数据字符串。

例如:

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
      record.errors[attribute] << (options[:message] || "is not a valid email format")
    end
  end
end

class IpValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/
      record.errors[attribute] << (options[:message] || "is not a valid IP format")
    end
  end
end

这种方法的缺点是我有很多额外的文件,其中的代码几乎相同,这在较大的应用程序中会很烦人。

是否有更好的方法(更 DRY)来定义基于正则表达式的验证,以便它们可以跨模型重用?

【问题讨论】:

  • 您可以将所有验证器放在一个文件custom_validators.rb 中,而不是使用一个文件par 验证器。另一种解决方案是将它们分组到一个分隔文件夹中,lib/validatorsapp/validators 并将此文件夹添加到配置文件中的加载路径中。
  • @AdrienCoquio 问题是,我已经为它们使用了一个单独的文件夹 - 问题是代码一次又一次地重复。唯一改变的是正则表达式和错误消息!

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


【解决方案1】:

您可以为正则表达式验证创建一个基类:

class RegexValidator < ActiveModel::EachValidator
  def regex_validate_each(regex, err_msg, record, attribute, value)
    unless value =~ regex
      record.errors[attribute] << (options[:message] || err_msg)
    end
  end
end

然后像这样子类化它:

class EmailValidator < RegexValidator
  def validate_each(record, attribute, value)
    regex_validate_each(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, "is not a valid IP format", record, attribute, value)
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多