Qiitaの質問フォーマットの素晴らしさを痛感したため、書き残させて頂きます!
こんにちは、koheiです。
Qiitaで質問をしようとして、改めて質問フォーマットはよくできているなと感じました。
その理由は
自己解決に導かれる
ためです。
そのきっかけになる部分は該当するソースコードをまとめた後に登場するこれです。
自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
該当するであろうソースコードを記載した後、ここで自分の検証した内容をまとめていると
本当にこれで質問して大丈夫?
予想以上にしょうもない失敗だとしたらどうしよう
と改めて自分の置かれている状況を見直すことができます。
直前にソースコードをまとめていることもあり、問題の棚卸しができるので
初学者こそ質問フォーマットを活用して素早く問題解決を目指すべき
だと感じました。
自分は某プログラミングスクールに通っていたのですが、
メンターに相談するために「質問フォーマット」が定められていて
その時も質問を作成することで頭の中が整理されて、質問することなく解決するということが多々ありました。
もちろん初学者だからこそのケアレスミス、思い込みなどが原因で大した問題ではないことが多いことが理由とも思いますが、
毎回勉強になることが多いため、今後も質問フォーマットを活用しながら学習を進めていきたいと思います。
ちなみに、今回作りかけていた質問は以下のような内容でした
解決したいこと
テスト時の
ActiveModel::RangeError:
Ruby on RailsでWebアプリを作成しています。
サインアップに関するテストコードを作成時に以下のエラーが出てしまいました。
解決方法を教えて下さると幸いです。
※はじめ、自身ではUTF-8の対応範囲が1~4バイトであることに対して、日本語入力が引っかかっていると思っていました。
エラー文にしっかりと
16697386183 is out of range for ActiveModel::Type::Integer with limit 4 bytes
と書かれているにも関わらず、、
発生していた問題・エラー
Failure/Error: @buyer.save
ActiveModel::RangeError:
16697386183 is out of range for ActiveModel::Type::Integer with limit 4 bytes
# ./spec/models/buyer_spec.rb:30:in `block (4 levels) in <top (required)>'
実際は電話番号をinteger型で受けようとして、
かつ11文字のランダムな数字でテストしたために起こったエラーでした。
該当するソースコード
モデル内のバリデーション
with_options presence: true do
略
validates :phone_number, numericality: { only_integer: true }, length: { maximum: 11 }
略
end
ファクトリーボットで生成するインスタンス
FactoryBot.define do
factory :buyer do
略
phone_number {Faker::Number.number(digits: 11)}
略
end
end
上記より生成されたインスタンス(例)
[1] pry(main)> @buyer = FactoryBot.build(:buyer)
(0.4ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
=> #<Buyer id: nil, email: "clemente.marvin@yahoo.com", phone_number: 69012459013,
略
自分で試したこと
カタカナでバリデーションをかけている箇所以外を全てローマ字で入力し再度テストしました。
漢字がなくなれば 、、、ここで思い止まりました。笑
その後、検証を進める内に
- 電話番号はstring型で受けるべきこと
- integer型は初めの"0"は認識されないことなど思い出しました。
また、今回エラーに引っかかった4バイト以内のintegerについて調べると
-2147483648から+2147483647
が対象であることも分かり、2147483648は同じエラーに引っかかることも検証できました。