0

私はモデルを持っています

class Owner < ActiveRecord::Base
  attr_accessible :telephone
  validates_uniqueness_of :telephone
  validates_telephone_number_of :telephone
  before_validation :telephone_normalize
end

レールコンソールで

a = Owner.new(:telephone => '949123456')
=> #<Owner id: nil, telephone: "949123456", created_at: nil, updated_at: nil> 
1.9.3-p362 :002 > a.valid?
Owner Exists (0.1ms)  SELECT 1 AS one FROM "owners" WHERE "owners"."telephone" = '+421949123456' LIMIT 1
=> false
1.9.3-p362 :003 > a
=> #<Owner id: nil, telephone: "421949123456", created_at: nil, updated_at: nil>

同じ、一意の番号を保存するとき:

1.9.3-p362 :006 > a.telephone = '949123457'
=> "949123457" 
1.9.3-p362 :007 > a.save
(0.1ms)  begin transaction
Owner Exists (0.2ms)  SELECT 1 AS one FROM "owners" WHERE "owners"."telephone" = '+421949123457' LIMIT 1
SQL (2.3ms)  INSERT INTO "owners" ("created_at", "telephone", "updated_at") VALUES (?, ?, ?)  [["created_at", Wed, 16 Jan 2013 11:55:44 UTC +00:00], ["telephone", "421949123457"], ["updated_at", Wed, 16 Jan 2013 11:55:44 UTC +00:00]]
(88.3ms)  commit transaction
=> true

Rails (3.2.11) では、数字の先頭の「+」が省略されます。数値の型は文字列です。また、プラス記号なしで保存しますが (一意の場合)、検証時にプラス記号を付けて呼び出します。

私は何を間違っていますか?

4

2 に答える 2

1

データベースの電話番号列は整数型だと思います。したがって、渡した文字列は範囲外です。だからこそ、あなたはこの問題に直面しています。

于 2013-01-16T12:08:47.993 に答える
0

残念ながら、バリデーターにバグがありましたvalidates_telephone_number_of。属性が変更されました:-/

言う

> a = 'aaa' # => 'aaa'
> b = a.to_s # => 'aaa'
> b << 'c' # => 'aaac'
> b  # => 'aaac'
> a  # => 'aaac'

を使用する必要がありますb = a.to_s.dup

于 2013-01-16T12:43:22.997 に答える