rails string length验证不起作用

时间:2012-08-04 21:07:57

标签: ruby-on-rails-3 validation ruby-on-rails-3.2

我必须遗漏一些基本但我不断收到验证错误的内容:

应用程序/模型/ 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

在rails c

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

导致ROLLBACK

  

bib.errors   => #<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(单元格:“0123456789”)也无法在控制台中运行。我错过了什么!我检查了rails docs on validationsrails api on model validations并尝试了很多不同的事情。有什么想法吗?我使用的是rails 3.2.6,刚刚升级到rails 3.2.7。没有变化。

1 个答案:

答案 0 :(得分:2)

gsub!修改字符串并返回nil if no changes were made

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

因此,如果字段仅包含数字,则代码在验证之前将字段设置为nil,从而导致其失败。通常最好避免在属性上使用gsub!,因为它与Rails的更改跟踪效果不佳。

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

应该做的伎俩