我必须遗漏一些基本但我不断收到验证错误的内容:
应用程序/模型/ 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 validations和rails api on model validations并尝试了很多不同的事情。有什么想法吗?我使用的是rails 3.2.6,刚刚升级到rails 3.2.7。没有变化。
答案 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
应该做的伎俩