我想在我的模型中添加一些逻辑,以确保设备数据库中序列号的字符串表示形式一致。下面是我正在考虑的一种示例:调用自定义验证并在将对象中的数据保存到数据库之前对其进行格式化。
class Device < ActiveRecord::Base
validates_presence_of :serialNumber
validate :validate_sn
def validate_sn
if !serialNumber.nil? && serialNumber !~ /-/
serialNumber = serialNumber.scan(/.{4}/).join('-')
end
end
end
这段代码有两个问题。首先,它会抛出一个错误,上面写着
NoMethodError: undefined method `scan' for nil:NilClass
在第 6 行,这让我感到莫名其妙。我可以通过将该行更改为:
sn = serialNumber; serialNumber = sn.scan(/.{4}/).join('-')
但是,如果有人可以解释为什么会这样,但第一个不是,我会很感激。真正的问题是数据保存时没有破折号(在应用上述修复之后)。我在这里忘记或误解了一些基本的东西吗?有没有人对此有更好的解决方案?
谢谢,