【Rails】現場Railsメモ

# 執筆中
- 復習
- アウトプット前提のインプット

# 環境
`Ruby 2.6.5`
`Rails 5.2.4.2`
`MySQL 5.7.28`

# Chapter1 RailsのためのRuby入門

## オブジェクト

- 言葉によって区別できるあらゆる「モノ」
- 全てのオブジェクトは`object_id`という固有番号をもち、固有の存在として認識される
- 仕事は**何らかの振る舞い(メソッド)**をすること

## クラス

- オブジェクトの原型になるもの(設計図)

> 人間
>> 太郎くん
>> 花子さん
>> hogeくん
>> fugaくん

人間が**クラス**に該当。

## インスタンス

- クラスを元に作成された実態

> 人間
>> 太郎くん
>> 花子さん
>> hogeくん
>> fugaくん

人間未満(言葉不適切？)が**インスタンス**に該当。

## 変数

- 何かのオブジェクトをさし示すことができる、ラベルのような存在

## ローカル変数

- プログラム中の一定の処理の範囲で使われ、その範囲が終わったら捨てられる

## インスタンス変数

- オブジェクトの内部に保持されてオブジェクトが存在する限り一緒に存在する

## メソッド

- オブジェクトの何らかの振る舞い
- クラスメソッドとインスタンスメソッド

> 人間
- 名前
- 体
- 喜怒哀楽
>> 太郎くん
- 1秒間にタイピングを10回打てる
>> 花子さん
- 3桁の数字の15個の和を2秒で求められる
>> hogeくん
- 100mを9.58で走れる
>> fugaくん
- 1時間で料理を10品作れる

人間クラスのインスタンスである4人は`歩く、食べる、笑う`ことができる。
`名前、体、喜怒哀楽`が**クラスメソッド**に該当。

人間クラスのインスタンスである4人のそれぞれにしかできない
特殊能力が**インスタンスメソッド**に該当。

## レシーバー

- メソッドを呼ぶ元のオブジェクト

> hoge = 'ほげ'
> hoge.length
> hoge.class

`hoge.length`の`hoge`がレシーバーに該当。
`.length`は**`Stringクラス`**(前述の人間クラス)がもつメソッドに該当。


## 返り値(戻り値)

- メソッドが呼ばれた時に帰ってくる値のこと

## 属性(Attribute)

- オブジェクトの抱えるデータ

###1-4~スタート

# Chapter3 タスク管理アプリケーションを作ろう

## テンプレートエンジン

- HTMLの構造が直感的にわかりやすいテンプレート

> ERBやHamlやSlim

## Strong Parameters

- 想定しているリクエストパラメーターのみ受け取る仕組みのこと

## flashとflash.nowの違い

- flash → 次のリクエストに対してデータを伝える → redirect
- flash.now → 同じリクエスト内で伝えることができる → render

## simple_format

- 入力時の改行を、表示させる時に改行としてviewに表示させることを可能にする

[リファレンス](https://railsdoc.com/page/simple_format)

# Chapter4 現実の複雑さに対応する

## 環境別rails db:migrate

```console:ターミナル
# 開発用
$ rails db:migrate
# テスト用
$ rails db:migrate RAILS_ENV=test
# 本番用
$ rails db:migrate RAILS_ENV=production
```

## change_cloumn_null

- 既存テーブルの既存カラムのNOT NULL制約をつけたり外したりできる

共同開発を意識し、今後は`rails db:rollback`は極力使用しないようにする

```console:ターミナル
$ rails g migration Changeテーブル名NameNotNull
```

```ruby:db/上記コマンドによって生成されるマイグレーションファイル
def change
  change_column_null :テーブル名, :カラム名, false or true
end
```

## オリジナルの検証コード(重要)

- P141~142

本書ではカンマを許可しないメソッドを実装

## ぼっち演算子(&.)

- nilガード

> if name&.include?(',')
>> nameがnilだった場合(空欄)にメソッドが実行されないようにする

## コールバック

- 登録や削除などの重要なイベントの前後に任意の処理を挟むことができる仕組み

> 然るべきタイミングが来たら処理を呼ぶことができる

## トランザクション

- 一連の複数の処理によるデータベースの生合成を保つための機能

## セッション

- 1つのブラウザから
- 連続して送られている複数のリクエストの間で
- ブラウザとサーバーで共有したい「情報」を
- <font color="Red">**サーバー側**</font>に保存する仕組み

## Cookie

- 1つのブラウザから
- 連続して送られている複数のリクエストの間で
- ブラウザとサーバーで共有したい「情報」を
- <font color="Red">**ブラウザ側**</font>に保存する仕組み

[セッションとCookie](https://umaroidblog.com/webtechnology1)

## digest

- ハッシュ化を行った文字列

> パスワードの保存時に使用

## ハッシュ化

- 元の値に戻すことができない一方的な変換

## Userモデルにadminフラグを追加

```ruby:マイグレーションファイル
def change
  add_column :users, :admin, :boolean, default: false, null: false
end
```

`:boolean, default: false`で`adminカラムに0が入る？`
データ取得時には`true`or`false`が入っている

## true or falseの言語化？

```console:ターミナル
$ rails c
user1 = User.first
user1.admin
→ false

user2 = User.find(2)
user2.admin
→ true

user1.admin? ? '権限あり' : '権限なし'
→ 権限なし

user2.admin? ? '権限あり' : '権限なし'
→ 権限あり
```

`? 'true(1)時の表示' : 'false(0)時の表示'`

## ログイン機能

- ログインする = セッションというリソースを作る
- リソース = コントローラが扱う概念的なデータのこと

## helper_method

- 全てのビューから使用可能に

```ruby:application_controller.rb
helper_method :current_user

private

  def current_user
    hogehogehogehoge
  end
```

application_controller.rbに記載することで**全てのコントローラ**から使用可能に
helper_method指定することで**全てのビュー**から使用可能に

## scope

- 繰り返し利用される絞り込み条件を読みやすくできる

## rails_autolink

- クリックで外部リンクへ遷移させる動作を簡単にする

# Chapter5 テストをはじめよう

## RSpec

- テスティングフレームワーク

## Capybara

- WebアプリケーションのE2Eテスト用フレームワーク
- テスティングフレームワークと組み合わせて使用
- Webアプリケーションのブラウザ操作をシミュレーションできる
- JavaScriptの動作を含めたテストを行える

## FactoryBot

- テスト用のデータを簡単に用意し、テストから呼び出して利用することができる

## System Spec

- ブラウザを通してアプリケーションの挙動を外部的に確認できる
- テストの粒度として一番外側に位置しており、特に重要と考えられるSpec

## ドライバ

- Capybaraを使ったテストに置いてブラウザ相当の機能を利用するために必要なプログラムのこと

## chromedriver-helperはサポート終了

`Selenium::WebDriver::Error::SessionNotCreatedError:`が表示
ググると代替えgemを入れれば問題ないとのこと

```ruby:Gemfile

group :test do
  - gem 'chromedriver-helper'
  + gem 'webdrivers'
```

## 共通化

- 同じ階層にある全ての`describe/context`内で共通する処理は一つ上の階層の`before`に書くことで共通化できる

## let

- 変数のように(実際に変数を作るわけではない)テストケースの値を代入できる
- describe/context内に定義すると、その外側でも内側でも代入した値を呼び出して使用できる

> letが実行されるのはletが呼ばれた時のみで、
確実に実行してほしい場合は <font color="Red">let!</font> を使う

# Chapter6 Railsの全体像を理解する

## RESTful

- 設計原則に従うシステムを指す形容詞

## ログの出力

- loggreオブジェクトのdebugメソッドを呼ぶ

| ログレベル(数字) | ログレベル　| 意味                              |
|:--------------|----------|:----------------------------------|
| 5             | unknown  | 原因不明のエラー                     |
| 4             | fatal    | エラーハンドリング不可能な致命的エラー     |
| 3             | error    | エラーハンドリング可能なエラー           |
| 2             | warn     | 警告                              |
| 1             | info     | 通知                              |
| 0             | devug    | 開発者向けデバッグ用詳細情報           |
```
logger.ログレベル
```

デフォルトのログレベルはdebug

## 条件別にparams分岐

```ruby
task_params = if user.premium?
  params.require(:task).permit(:name, :description, :special)
else
  params.require(:task).permit(:name, :description)
end
```

## アセットパイプライン

- JavaScript、CSS、画像などのリソースを効率的に扱うための仕組み

> 開発者が書いたJavaScriptやCSSを、最終的にアプリを使う上で都合の良い状態にするためのパイプライン処理を行う