経緯
ECサイトにシステムから1800ドルで出品する処理を行ったところ1ドルで出品されるという報告を受ける。
⇨検証のため同じ環境で同じ価格で出品したところ、正常に出品される。
⇨原因がわからない。
という事象が発生。
原因
出品テストの担当に聞いたところ1800ドルが1ドル、2200ドルが2ドルになっているとのこと。
ここで「入力値にカンマやピリオドが入っているのでは」と気付く。
入力欄を確認するとnumber_fieldではなくtext_fieldとなっており、
価格を1,800ドルで出品してみると、1ドルで出品される現象が再現された。
いろいろ確認してみた
今回の対処としてはtext_fieldをnumber_fieldに修正し、
数字以外入力不可能とすることで完了したが、
int型,decimal型で文字列を含む数字を受け取った時の挙動を確認してみた。
1,000 → 1
1,000円 → 1
10,000 → 10
¥10,000 → 0
いちまんえん → 0
先頭から文字列までの数値が保存されるようだ。
まとめ
価格、数量など数値しか扱わない部分はnumber_fieldを使いましょう。
初歩的すぎかもしれませんが、「1500ドルが1ドル、2200ドルが2ドルになっている」の情報がなかったら
たぶんもっと気付くのに時間がかかってたと思うので戒めも含めて書き記します。
追記
number_fieldにすると小数点も弾かれてしまうので、
オプションでstep:を追加するのを忘れずに
= f.number_field :selling_price,
class: 'form-control',
min: 0,
step: 0.01,
required: true