0

我一定遗漏了一些基本的东西,但我不断收到验证错误:

应用程序/模型/person.rb

class Person < ActiveRecord::Base
  attr_accessible  :cell

  before_validation :format_cell_string

  validates :cell, :length => { :is => 10 }

  protected

    def format_cell_string
      self.cell = self.cell.gsub!(/\D/, '') if self.cell != nil
    end

end

在轨道 c

> bib = Person.new(cell: "1234567890")
> bib.save

导致回滚

围兜错误 => #<ActiveModel::Errors:0x007fcb3cf978d8 @base=#<Person id: nil, created_at: nil, updated_at: nil, cell: nil>, @messages={:cell=>["is the wrong length (should be 10 characters)"]}>

认为这可能是 Rails 控制台或 irb 错误,我也尝试了我的表单,但无济于事。尝试bib = Person.new, bib.save 然后 bib.update_attributes(cell: "0123456789") 在控制台中也不起作用。我错过了什么吗!我检查了有关验证的rails 文档和有关模型验证的rails api,并尝试了许多不同的方法。有什么想法吗?我使用的是 rails 3.2.6,刚刚升级到 rails 3.2.7。不用找了。

4

1 回答 1

2

gsub!nil 如果没有进行任何更改,则修改字符串并返回:

"1234567890".gsub!(/\D/, '') #=> nil

因此,在该字段仅包含数字的情况下,您的代码会在验证之前将该字段设置为 nil,这会导致其失败。gsub!通常最好避免使用on 属性,因为它不能很好地与 Rails 的更改跟踪配合使用。

self.cell = self.cell.gsub(/\D/, '') if self.cell != nil

应该做的伎俩

于 2012-08-04T21:22:11.153 回答