以下正则表达式验证电话号码(可能是其他任何内容),允许尾随空格:
validates :phone,
:presence => true,
:format => {:with => /\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}[ ]*\z/}
我想在最后允许空格的原因很简单,因为有些用户可能会错误地输入它。
我希望能够做的是,在验证期间允许这些空格,但是在保存记录时,去除任何前导/尾随空格。通过这种方式,我可以允许用户犯一个小的“错误”(即结尾处的空格),但仍保存保存到数据库的“完全有效”值(在这种情况下是电话号码)。
这可以自动完成(对于任何型号,任何字段),以便在保存之前我不必专门修剪每个字段吗?
答案 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