ruby-on-rails - 使用 Rails 自定义验证来修改数据

标签 ruby-on-rails ruby ruby-on-rails-3 preprocessor customvalidator

我想向我的模型添加一些逻辑,以确保设备数据库中的序列号具有一致的字符串表示形式。下面是我正在考虑的示例:调用自定义验证并对对象中的数据进行格式化,然后再将其保存到数据库。

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('-')

但是,如果有人可以解释为什么它有效,但第一个不起作用,我将不胜感激。真正的问题是保存的数据没有破折号(在应用上述修复之后)。我是否忘记或误解了一些基本的东西?有没有人有更好的解决方案?

谢谢

最佳答案

尝试

def validate_sn
  if !self.serialNumber.nil? && self.serialNumber !~ /-/
    self.serialNumber = self.serialNumber.scan(/.{4}/).join('-')
  end
end

关于ruby-on-rails - 使用 Rails 自定义验证来修改数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5409150/

相关文章:

ruby-on-rails - 资源模型名称与路径或 Controller 不匹配时如何编写路由

ruby-on-rails - 如何使用重新处理将已上传的回形针图像调整为 s3? ( rails )

ruby - 将字符串截断为前 n 个单词

mysql - 如何从EventMachine返回MySQL查询结果?

ruby-on-rails - 在Rails中,有没有一种简单的方法可以在创建父对象的同时创建子对象?

javascript - 单击时,将变量从 Javascript 传递到 Rails/Ruby

ruby-on-rails - Ruby On Rails Mongoid 分组依据

ruby - 使用 Chef 删除部分但不是全部子目录

ruby-on-rails - Devise 2.2.3 始终在登录前显示已登录通知

ruby-on-rails-3 - Rails 3 rspec + capybara - current_path 为零?