这是一个简单的问题:
如何在ActiveRecord中设置字符串字段的默认格式?
我尝试了以下内容:
def phone_number_f
"...#{phone_number}format_here..."
end
但我想保持方法名称与字段名称相同。
答案 0 :(得分:3)
不确定你到底在找什么,但我猜这就是这个。
def phone_number
"...#{read_attribute(:phone_number)}format_here..."
end
答案 1 :(得分:1)
您是希望以特定格式存储内容还是以特定格式输出它们。
除非您必须对事物进行计算,否则在将数据存储到数据库之前将数据放入正确的格式更有意义。这样你只需要转换一次。
最好的方法是使用before_validate回调将事物放入正确的格式(如果还没有)。与validates_format_of helper一起使用它以确保它有效。您可能已经将无法按摩的数据传递到您想要的格式。
如果确实需要执行计算并且可能需要更改输出格式,则可以使用格式化程序回调方法作为格式化字符串。您可能需要查看String#sub,String#unpack和Kernel#sprintf / String#%。
北美电话号码示例: 正则表达式可能是错误的,但这不是示例的重要部分。
before_validate :fix_phone_number_format
def fix_phone_number_format
self.phone_number = "(%s) %s-%s" % phone_number.gsub(/[\D]/, "").unpack("A3A3A4")
end
validates_format_of :phone_number, :with => /^(\d{3}) \d{3}-\d{4}/
编辑:转换稍微复杂一点,所以这里是一步一步细分,就像ruby做的事情一样。电话号码为123-555-1234。
"(%s) %s-%s" % phone_number.gsub(/[\D]/, "").unpack("A3A3A4")
"(%s) %s-%s" % "123-555-1234".gsub(/[\D]/, "").unpack("A3A3A4")
# remove all non digits from the string
"(%s) %s-%s" % "1235551234".unpack("A3A3A4")
# break the string up into an array of three pieces.
# Such that the first element is the first 3 characters in the string,
# the second element is 4th through 6th characters in the string,
# and the third element is the remaining digits.
"(%s) %s-%s" % ["123","555","1234"]
# Apply the format string to the array.
"(123) 555-1234"