回答編集履歴

1

追加質問への回答を追記

2020/09/10 01:46

投稿

necocoa
necocoa

スコア209

test CHANGED
@@ -11,3 +11,73 @@
11
11
  ActiveRecordでは裏でAttributesを用いて行っているため、全角数字を半角数値に変換していますが、
12
12
 
13
13
  Attributesを設定していない、ActiveModelでは型変換はされず、validateに引っかかります。
14
+
15
+
16
+
17
+ ##### 追記
18
+
19
+ [https://railsguides.jp/active_record_validations.html#numericality](https://railsguides.jp/active_record_validations.html#numericality)
20
+
21
+
22
+
23
+ numericalityを使うとread_attribute_before_type_castというメソッドを使って入力された時の値が数値かどうかを判定します。
24
+
25
+ つまり全角数値を入力すると、カラムには半角数値に変換された数値が入っているが、全角数値でvalidateされます。
26
+
27
+
28
+
29
+ formatでは入った値が正規表現通りかどうか、を判定しているのでvalidateが通ります。
30
+
31
+
32
+
33
+ 以下`rails c`で実行してみた結果
34
+
35
+
36
+
37
+ ```user.rb
38
+
39
+ class User < ApplicationRecord
40
+
41
+ validates :age, numericality: { only_integer: true }
42
+
43
+ end
44
+
45
+ ```
46
+
47
+
48
+
49
+ ```console
50
+
51
+ u = User.new
52
+
53
+ u.age = '01'
54
+
55
+ u
56
+
57
+ => #<User id: nil, age: 0, created_at: nil, updated_at: nil>
58
+
59
+ u.age
60
+
61
+ => 0
62
+
63
+ u.read_attribute_before_type_cast(:age)
64
+
65
+ => "01"
66
+
67
+ u.valid?
68
+
69
+ => false
70
+
71
+ ```
72
+
73
+
74
+
75
+ あと、numericalityにはwithのoptionはないので、Railsガイドを読んでoptionを設定してみてください。
76
+
77
+
78
+
79
+
80
+
81
+ 今回は自分もなぜそうなっているのかわからなかったため、numericalityのコードを見てみました。
82
+
83
+ 勉強のきっかけを頂きありがとうございます!