验证正则表达式格式,允许输入空格但保存记录时删除它们

时间:2011-03-07 22:14:23

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

以下正则表达式验证电话号码(可能是其他任何内容),允许尾随空格:

validates :phone, 
          :presence => true,
          :format => {:with => /\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}[ ]*\z/}

我想在最后允许空格的原因很简单,因为有些用户可能会错误地输入它。

我希望能够做的是,在验证期间允许这些空格,但是在保存记录时,去除任何前导/尾随空格。通过这种方式,我可以允许用户犯一个小的“错误”(即结尾处的空格),但仍保存保存到数据库的“完全有效”值(在这种情况下是电话号码)。

这可以自动完成(对于任何型号,任何字段),以便在保存之前我不必专门修剪每个字段吗?

2 个答案:

答案 0 :(得分:2)

如果您只为几个字段执行此操作,最简单的方法是使用自定义设置器:

def phone_number=(val)
    self[:phone_number] = val.rstrip
end

但是如果你想要一个更通用的,随处使用的设置,我建议写一个ActiveRecord扩展 - 这就是:

class ActiveRecord::Base
    def self.strips_trailing_spaces_from(*attrs)
        @@sts_attrs ||= []
        @@sts_attrs << attrs
        before_save :strip_trailing_spaces
    end

    def strip_trailing_spaces
        @@sts_attrs.each do |attr|
            val = self[attr]
            self[attr] = val.rstrip if val.is_a?(String)
        end
    end
end

然后对于你想要使用它的每个模型,你可以简单地调用(Rails“宏”样式):

class MyModel < ActiveRecord::Base

    strips_trailing_spaces_from :phone_number, :name, :pizza, :etc

    # ...classy stuff...
end

注意 - 此代码尚未经过测试,但应该了解它。希望它有所帮助!

答案 1 :(得分:-1)

# strip leading and trailing whitespace in s
# ... simply:
s.strip!                   # modify s
s.strip                    # return modified string
# ... or with a regex
s.gsub!(/^\s+|\s+$/, '')   # modify s
s.gsub(/^\s+|\s+$/, '')    # return modified string