KATUUUNs blog

プログラミング学習で得た知識をアウトプットするためのブログです

学習37日目 本日の積み上げ

こんにちはKATUUUNです。
最近は私は空調の効いた室内でひたすらプログラミングをしているため、夏の暑さをあまり感じていません。

今日は制作中のオリジナルアプリの進捗を共有します。

  • DB設計

ER図作成とテーブル作成を行いました。カラム、アソシエーション、型、NOT NULL制約、外部キーなどが見やすくまとまり、思考が整理されました。

  • 画面遷移図

オリジナルアプリ開発に向けてどんなページが必要か、どのページへ遷移するか。これも視覚的にまとめることができました。

  • 下準備

rails newやrails db:createを実施しました。これはいつも通り

  • その他

Rubocopの設定、turbolinksの無効化などを行いました

  • 現在

ビューファイルを作成しています。今までの開発は既にビューファイルが用意されていました。1から作り上げる大変さを早くも痛感しております。

明日はHTML&CSSと格闘しそうな予感。頑張るぞ!

学習36日目 sleepについて

こんにちはKATUUUNです。
オリンピックでは陸上競技を主に見ていました。男子4✖️100mリレーで日本代表のバトンミスは本当に胸が痛みました。まるで自分があの場にいるかのような錯覚をしてしまい、泣きそうになりました。

f:id:KT34309349:20210809194708j:plain

オリンピックの終わりと同時に私は新たな開発を始めました。フリマアプリの開発がひと段落して、今度はオリジナルアプリを開発してしていきます。要件定義やDB設計など、事前の準備をしっかりしてから取り掛かりたいです。

今日はフリマアプリの振り返りとしてsleepについて語りたいと思います。

背景
商品の購入機能の際、モデル単体テストコードを記載して、テストコードを実施して見たところ、

ActiveRecord::StatementInvalid:
Mysql2::Error::ConnectionError: Lost connection to MySQL server during query

のエラーが発生しました。

原因
DBや外部サイトなどにアクセスするときに、連続でアクセスすると負荷がかかりすぎてしまうようです

対策
ここでsleepを使います。sleepは、一定時間、rubyプログラムの実行をストップするメソッドです。一定時間経過後、次の行から実行が再開します。

購入情報のテストコードファイル

RSpec.describe PurchaseAddress, type: :model do
  describe '購入情報の保存' do
    before do
      user = FactoryBot.create(:user)
      display = FactoryBot.create(:display)
      @purchase_address = FactoryBot.build(:purchase_address, user_id: user.id, display_id: display.id)
      sleep 0.1
    end

以上です。ありがとうございました。

学習32日目 商品購入機能のテストコードにPassword is invalid. Include both letters and numbersが出た

お疲れ様です。KATUUUNです。
中高と陸上部でした。
今日、オリンピックの競歩で日本人のメダルを見た時は感動しました。
f:id:KT34309349:20210805215701j:plain
今日はフリマアプリで商品購入機能を実装しました。
createアクションに関するエラー対処とテストコード記述に苦戦したためbinding.pryオタクになってしまいました。

今日も苦戦した箇所をアウトプットします。

・商品購入機能のモデル単体テストコードにPassword is invalid. Include both letters and numbersが出た

商品購入機能のテストコード内容は
住所、電話番号、クレジットカード情報のpresense trueや半角などの正規表現のモデル単体テストコードです。

そこにいきなり

ActiveRecord::RecordInvalid:
       Validation failed: Password is invalid. Include both letters and numbers

が現れたら驚きませんか?パニックになりました。

・結論
パスワードはuserモデルの単体テストコードにおいてFakerというgemでテストコードに用いる値をランダムに生成していました。

password    {Faker::Internet.password(min_length: 6)}

この記述だと生成されるランダムのパスワードは時には数字のみパスワードだったり、英字のみのパスワードだったりします。それが上記のエラーにつなっが模様

password    {"1a"+Faker::Internet.password(min_length: 6)}

こう記述することで英字と数字を最低1文字ずつ含めることができて解決です。

学習30日目 テストコードで苦労した点

こんにちは、KATUUUNです。
昨日に引き続き、フリマアプリを作成していました。今日は、商品出品機能、商品一覧機能、商品詳細機能、商品情報編集機能を実装しました。
また今日もエラーに溢れて大変でしたが、エラーが自分を成長させてくれた気がします。

今日アウトプットしたいことは、商品出品機能で、モデル単体テストコードを書いていたときです。

「画像が空だと保存できない」がいつまで経ってもうまくいかない。
2時間くらい悩みました。
f:id:KT34309349:20210803214942j:plain

it '画像が空だと登録できない' do
      @display.image = ''
      @display.valid?
      expect(@display.errors.full_messages).to include("Image can't be blank")
    end

答えがこちら

it '画像が空だと登録できない' do
      @display.image = nil
      @display.valid?
      expect(@display.errors.full_messages).to include("Image can't be blank")
    end

気づかなかった!

こういうケアレスミスなくなるといいですね。

学習28日目 ユーザー管理機能で苦労した点

こんにちは、KATUUUNです。
毎日暑いですね。ちなみに今日歯医者に行ったら虫歯があると診断されました。
f:id:KT34309349:20210801213603j:plain
機能に引き続きフリマアプリを作っていました。今日はユーザー管理機能(新規登録、ログイン、ログアウト)などを実装していました。

そこで苦労した点を2点紹介します

正規表現
新規登録の際、全角漢字・カナの表現をどうするか

with_options presence: true, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: '全角文字を使用してください' } do
  validates :first_name
  validates :last_nam
end

ぁ-んァ-ヶ一-龥々ー
・平仮名は「ぁ」から「ん」までで全てを表現できます
・カタカナは「ァ」から「ン」までにすると「ヴ、ヵ、ヶ」が弾かれてしまいます
・「々」utf-8文字コード上で記号として認識されているため、別途「々」の指定を追加する必要があります。
・メアリーなどの「ー」も別途指示が必要です。

②devisenのインストールの手順を間違えた
本来なら
Gemfileに gem 'devise'記載後
bundle install

rails g devise:install

rails g devise user
のところをrails g devise:installを忘れてrails g devise userしてしまった。
そのまま
マイグレーションファイルにテーブル情報を記載して、
rais db:migrateを実施したところエラー文が!

ルーティングファイルの以下を削除して
devise_for :users

rails d model user
でbundle installの直後まで戻りました。

学習27日目 データベース設計で苦労した点

こんにちは、KATUUUNです。
最近はプログラミングを学習しながら、合間にオリンピックを見ています。ガッツリ見る時間はないのでYouTubeNHKチャンネル「2分でわかる」シリーズで結果だけ見ています。ちなみに私は中・高と陸上部でした。短距離をやっていました。早く短距離みたい!
f:id:KT34309349:20210731214635j:plain

今日も学習の成果をアウトプットしたいと思います。

昨日から、メルカリのようなフリマアプリを作成しています。今日はデータベース設計をしていました。ひたすらREADMEにテーブル情報とアソシエーションを考えていました。

そこで苦労した点を3点紹介します

・誕生日の情報
ユーザー管理機能を実装するためにUsersテーブルを作成していました。誕生日の情報を入れようとしていました。
カラム名
birth_year integer型
birth_month integer型
birthday integer型
正直恥ずかしいです。
f:id:KT34309349:20210731215351j:plain
date型というものがあったとは!

・ActiveHash
都道府県情報など、変更する予定のないデータはデータベースに保存するのも面倒で、ビューファイルに記載すると可読性に欠けます。
そこでActiveHashを用いて、modelファイルに記述する方が便利です。
また、ユーザー情報や配送先住所など複数に使いまわすこともできます。

・ハイフン
郵便番号や電話番号などハイフンがつくものはinteger型ではなくstring型を用いる

以上です。ありがとうございました。

学習25日目 エラーがエンジニアを成長させるお話

f:id:KT34309349:20210729212227j:plain:w500:h600

こんばんは、 KATUUUNです。

今日はとあるアプリを実装していました。その中で、マイページを作っていた時のこと

・link_toからのパスもあってる
・ルーティングも設定した
・コントローラーも記述した
・マイページ用のビューも作成した

なのに、No routing error

Why!?

結局2時間考えてしまいました。

実はリンク先のパスが間違えていました。rails routesで確認したらuser_pathやん!と何も考えず記載。そのまま泥沼へ。

userのid情報入れ忘れていました。なんという凡ミス

<%= link_to "#{current_user.name}さん", user_path(current_user.id), class: :greeting__link%>

本当に良い経験になりました。