べんきょうのきろく

毎日こつこつ…プログラミング勉強の記録。

勉強の日

10:04開始

ruby on railsって、内容の書き方はよく理解できていても、そこにたどり着くまでの設定とかがよくわかんなかったりする。

でも今日はテストコードを書くまでの準備段階が突然理解できたからそれをまとめておく。

 

<モデル単体のテストコードを書くときの手順>

Gemfile  …group :development, :test do内に追記

gem 'rspec-rails…モデル単体はRSpecでテストコードを書く

gem 'factory_bot_rails…繰り返し記載を避けるために使う

gem 'faker'  …適当な名前やemailやパスワード等を用意してくれる

Ubuntu

bundle install  …①のgemをインストール

ctrl+c   …gemを新しくインストールしたため、再起動してアプリに反映

rails s  

rails g rspec:install  …導入したrspecを使えるようにする

③.rspec

--format documentation  …最終行に追記してテストコードの結果をターミナルで可視化する

Ubuntu

rails g rspec:model モデル名(単)  spec/factories/モデル名(複).rb(⑤)spec/models/モデル名(単)_spec.rb(⑦)を同時に作成

⑤spec/factories/モデル名().rb

FactoryBot.define do

  factory :モデル名(単) do

    Fackerを使ったテスト用データを書き込む

    例:name {Faker::Name.last_name}

    例:email {Faker::Internet.free_email}

    例:password {Faker::Internet.password(min_length: 6)}  ※バリデーションも付けられる

  end

end

⑥テストコードのexample整理

⑦spec/models/モデル名()_spec.rb  …⑥で整理したexampleを書いてテストコード記述

require 'rails_helper'

 

RSpec.describe モデル名(単), type: :model do

  before do

    インスタンス変数を設定して⑤の内容を呼び出す

    例:@post = FactoryBot.build(:post)

  end

 

  describe 'タイトル' do

    context '●●できる場合' do

      it '●●が存在していれば保存できる' do

        テストコード書く

        (⑤の内容を使って、上手くいくよーなコードを書く)

        例:expect(@post).to be_valid

      end

    end

    context '●●できない場合' do

      it '●●が空では保存できない' do

        テストコード書く

        (⑤の内容をダメな状態に再設定して、その状態だとどんなエラーになるかを書く)

        例:@post.title = ''
        例:@post.valid?
        例:expect(@post.errors.full_messages).to include("Title can't be blank")

      end

    end

  end

end

Ubuntu 

bundle exec rspec spec/models/モデル名(単)_spec.rb  …テストコード実行して緑文字なら成功

 

今日がくるまでに応用が終わる予定だったんだけど、あと少し終わらず。

2-3日以内に発展に進みたいな。

このまま気分よく進めるようにがんばる!

両立むずかしい。

4:52開始

新学期準備と勉強(+家事+育児)の両立がむずかしい。

優先順位ちゃんと付けてしっかり取り組まないと…!

 

・クラスの継承

親クラスの内容を子クラスにも引き継がせることで、プログラミングの効率化になる。

・オーバーライド

親クラスと同じ名前のインスタンスメソッドを子クラスにも作って上書きすること。オーバーライド前は親クラスのメソッドが実行されるが、オーバーライド後は子クラスのメソッドが実行される。

 

進捗遅れてて焦るけど、ひとつずつ着実に。落ち着こう。

遅れてる

5:03開始

今日も家のことやってからスタート。

プルダウンの理解に苦しんで、nameとかvalueとかがわかったようなわかっていないような。下記が今のところの理解。正しいか自信なくて問い合わせ中。

 

・select 

プルダウン作るときの親要素。nameでparamの形を指定して一番の中身はその後のoptionで指定する

・option

プルダウンの選択肢。valueを指定すればその内容がparamsの中身になって、そうでなければoptionのテキストがparamsの中身になる

・input

コントローラーに送りたい内容を書く。上記と同じように、nameでparamsの形を指定して、valueで中身を書く。type="hidden"にすればウェブには表示されずに、データを送る機能だけ付けられる。

 

合ってますか?ここまで理解するのにもそこそこ時間を要したんだけどな。

今週中に応用が終わるように、どこかで時間作らなきゃな。がんばろ。

練習

5:03開始

今日も5時まで新学期準備。

 

・リンクのアンダーバーを消す

.class a { text-decoration: none; }

 

今日はビューの作成練習メインで、インプットよりアウトプット多くて楽しかった。

ただ、いつも解説とクラス名が異なっていて、後の確認作業が面倒にならないように、自分でクラス名設定しても解説見ながらカリキュラムに合わせてクラス名変更する作業が発生しちゃう。

あと .class{ } でなく .class a{ } を使おうという思考がなくて、解説見て理解できても実際自力で使うまでに至ってない気がする。 

まぁでもこれも数こなすしかないのかな。がんばろ。

自分ノートの安心感

5:10開始

新学期準備を30分くらいしてから勉強開始。

githubを初めて学習したころのカリキュラムと現在進行形のカリキュラムを見比べながら進めていると、時間はかかってしまうけど理解度は結構違う。OneNoteに書いてなかった時期の範囲だから、特にちゃんと理解につながっている実感があって、自分がレベルアップしてるのを感じられて気分がいい。…から勉強が楽しくなって朝の準備の時間をおしてしまう^^;

 

・render

部分テンプレート適用時に使う。部分テンプレートの部品側は _名前.html.erb の名称のファイルで、完成形側は <%= render "部分テンプレート名" %> で部品部分のレイアウトをする。

 

あーこれやったなーと過去を振り返るよりも、現在の学習に専念よりも、今後オリジナルアプリの作成で使えそうな要素だなーと先を見ているような自分がいる不思議な感覚になった。

github苦手意識

4:50開始

次の単元が4時間かかるらしくてもう少しできるけど今日は終了。

 

・マークダウン

README.mdを書くのに使う記法。GitHubに載せると見やすいテーブルの形になる。

・READMEファイル

そのアプリの全体の仕様が書かれている説明書みたいなもの。テーブルの内容や繋がりが書かれたりする。

 

OneNoteを取り始めたのが勉強開始して1か月経ってからで、それ以前の内容が書かれてないせいか苦手意識が強い…

UbuntuGitHubは特に、間違ったときの直し方がわからないから、どうしても いやだな~ と思ってしまう。

逆に、OneNoteに書ければ理解できるのでは とも思うから、必死に以前の内容振り返ったりしながら書いてるけど、その分やっぱり時間はかかっちゃう。

でもまぁ仕方ない! OneNoteに書ければ理解できる を信じて続けるしかない!

苦手こそ伸びる、伸ばそ。信じよ。

応用の最終章へ突入

4:35開始。

新しい章に入ると、またやる気と何をするのか楽しみで勉強捗る!

そして最終章だと何が理解できていて何が理解できていないかも洗い出せるし、ここで理解できることもあるし、何だかワクワクしちゃう。

 

・中間テーブル

多対多のテーブルの間に入るテーブル。2テーブルが1、中間テーブルが多の1対多の関係となって、各idの紐づけのみ行う。2テーブルのmodelに【has_many :中間テーブル】と【has_many :もう1つのテーブル, through: :中間テーブル】を書いて、中間テーブルのmodelには【belongs_to :テーブル1】【belongs_to :テーブル2】を書けば紐づけ完了。

 

ところで、Rubyドリルで配列に1,2,3が含まれるかを書いたプログラム。

上手く処理してくれるけど、引数に&&を使う書き方がネット検索でヒットしない。

この書き方って間違ってるのかな?

def array123(nums)
  if nums.include?(1 && 2 && 3)
    puts "True"
  else
    puts "False"
  end
end

array123([1, 1, 2, 3, 1])