teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追加質問への回答を追記

2020/09/10 01:46

投稿

necocoa
necocoa

スコア209

answer CHANGED
@@ -4,4 +4,39 @@
4
4
  その型によってよしなに全角数値から半角数値へと変換したりしてくれます。
5
5
 
6
6
  ActiveRecordでは裏でAttributesを用いて行っているため、全角数字を半角数値に変換していますが、
7
- Attributesを設定していない、ActiveModelでは型変換はされず、validateに引っかかります。
7
+ Attributesを設定していない、ActiveModelでは型変換はされず、validateに引っかかります。
8
+
9
+ ##### 追記
10
+ [https://railsguides.jp/active_record_validations.html#numericality](https://railsguides.jp/active_record_validations.html#numericality)
11
+
12
+ numericalityを使うとread_attribute_before_type_castというメソッドを使って入力された時の値が数値かどうかを判定します。
13
+ つまり全角数値を入力すると、カラムには半角数値に変換された数値が入っているが、全角数値でvalidateされます。
14
+
15
+ formatでは入った値が正規表現通りかどうか、を判定しているのでvalidateが通ります。
16
+
17
+ 以下`rails c`で実行してみた結果
18
+
19
+ ```user.rb
20
+ class User < ApplicationRecord
21
+ validates :age, numericality: { only_integer: true }
22
+ end
23
+ ```
24
+
25
+ ```console
26
+ u = User.new
27
+ u.age = '01'
28
+ u
29
+ => #<User id: nil, age: 0, created_at: nil, updated_at: nil>
30
+ u.age
31
+ => 0
32
+ u.read_attribute_before_type_cast(:age)
33
+ => "01"
34
+ u.valid?
35
+ => false
36
+ ```
37
+
38
+ あと、numericalityにはwithのoptionはないので、Railsガイドを読んでoptionを設定してみてください。
39
+
40
+
41
+ 今回は自分もなぜそうなっているのかわからなかったため、numericalityのコードを見てみました。
42
+ 勉強のきっかけを頂きありがとうございます!