個人アプリ開発期間中のメモ

🔳5/30
jqueryは複数バージョン入れると起動しなくなる。
🔳5/27
= link_to の中に= link_to を埋め込むと上に定義した= link_to が消される（上書きされる）
ページネーションを真ん中に表示させる方法
.pagination {
  justify-content: center;
}
ページネーションのビューを変える方法（bootstrap4を導入してる前提）
rails g kaminari:views bootstrap4

 🔳5/26
importantは多様使用しない
夢と魔法のeach文の使い方を覚えた
🔳cssには適用する優先順位が存在する。
上から順に読まれる
全称セレクタ	*	0
タイプセレクタ	p	1
擬似要素	:first-child	1
擬似クラス	[type="text"]	10
classセレクタ	.fugafuga	10
idセレクタ	#piyopiyo	100
要素に直書き	style=""	1000

🔳5/25のアウトプット
empty?は配列が空か確認する
nil?は配列が存在するか確認する
:tag_idsで送られてくるからparamsも同じにする 勝手に[ ]をつけない
1cm=40px

🔳undefined method `include?'
whereで出る場合はid系列を指定してないから

🔳jQuery
html("")とempty()は同じ意味だけどemptyのほうが直感的に分かりやすい。
removeはdivごと消す。呼び出すまで復帰しない

foregin_key = 入口
source = 出口

🔳collectionとmember
7つの基本アクション以外でルーティングを定義する時には
collectionかmemberを利用します。
collectionはルーティングにidがつかない。全て出る
memberはURLにidがつく。条件指定可能。どのユーザーのIDの一覧かが指定できる。

◎throughとsourceの関係性
情報をかき集めてきてuserテーブルに返ってくるイメージ

form_withはremote: trueがデフォルト

🔳findメソッドとfind_byメソッドの違いや使い分け
◎findメソッド
・検索するIDがわかっている場合
・最初の1件のテーブルのカラムしか持ってこれない（複数カラム持ってこれない）
例）@tweet = Tweet.find(id: params[:tweet_id])
これはカラム1つを持ってくるからok
@like = Like.find(tweet_id: params[:tweet_id], user_id: current_user.id)
これはエラーになる。複数のテーブルからカラムを持ってきてるから

◎find_byメソッド
・検索するIDが不明で、別の条件でレコード検索をしたい場合
・2つ以上のIDで1つのライクを限定して検索する時はfind_by（複数条件指定できるから）
@like = Like.find_by(tweet_id: params[:tweet_id], user_id: current_user.id)
これはエラーにならない

◎個人アプリ構想
紙に書いて書き出す
イメージして移せる
細かく書いておく。忘れたら見直す
大体紙に書いておく
トップは崩れてもいいぐらい
ビューは作り込みすぎない
とりあえず作る。何が足りないのかを知る
2個め作るくらいの勢い
理想としながら技術
分からないことがとても不安になる

foreign_key
参照先を参照する外部キーの名前を指定できる（デフォルトは、参照先のモデル名_id）
 
外部キー制約は、外部キーの対応するレコードが必ず存在しなくてはいけないという制約です。外部キーのカラムに値があっても、その値を主キーとして持つ他のテーブルのレコードがなければいけません。

buildとcreateの違い
記録する範囲が異なる
build()メソッドはインスタンスをメモリ上にのみ記録する
create()メソッドはテストデータベース上にも保存して、データを永続化させる
使い分け
DBに書き込むのは時間がかかるので、DBに保存する必要がないときはbuildを使う
属性のチェックだけの場合もbuildで済む

外部キー制約を学びなおしたけど、親？にあたるtweet_id消えてもエラー起きなかった

🔳今日の学び
やたらめったら外部キー制約をかけるもんじゃない。
データの整合性を取るために削除できなくなる。お互いが引っ張り合うイメージ
記事が削除できなくて、commentsテーブルのreferences型のid達をintegerに変えたら削除できたから
削除する予定があるものに外部キー制約をかけてはいけない！！！！

🔳今日の学び
外部キー制約をかけたカラムは、削除しようとするとMySQLエラーが出る。
対処するには、そのカラムに関連してるテーブルを全てdown状態にしてから編集する！！


🔳kaminari の英語表記を日本語に変えられた！
ymlファイルを編集してdefalut_localeをja.ymlに変えた

margin 0 autoを使う時はwidthとセットだよ
jqueryで中のアクションでidを指定するときは'[id=id]'
🔳アソシエーションとは
① モデルクラスにhas_manyやbelongs_toなどのメソッドで関係が定義されている
② 所属する側のテーブルに所属するモデル名_idというカラムがある

🔳references型を使う時の注意
_idがいらない（「tweet_id」が「:tweet」に）。自動的にindexが貼られる。

ローカル変数とインスタンス変数の違い（スコープ）
@マーク付けたらどこでも使えるけど、なかったら、そのメソッド内でしか使えない

復習の大切さを痛感
もう1度自分で1から作業をすることでかなりインプットになった。
理解はできてるけど忘れてるコードがたくさんあった。
nicknameカラムを送れるようにするdevise_parameter_sanitizerはrequireみたいな意味
カラムを消す時はrollbackじゃなくてちゃんとカラムを削除する。同じデータが2個できた

◎labelとインプットで便利な仕組みづくり
labelにforを指定してinputにidを指定すると、labelをクリックしただけでinputが動く
facebookのログインページ
dependent: :destroyを貼る
◎今日の共有
rsとかのショートカットの説明
ナイトモードでドライアイ軽減

1つのモデルの中に「１対多」の関係を見出したら、モデルを分けましょう。

🔳ER図
◎エンティティ
データのまとまり（顧客とか名前が入ったテーブルの）
◎アトリビュート
属性情報つまり中身のこと（顧客カラムとか名前カラムとか）
◎リレーション
テーブル間の関係
◎カーディナリティ
一対多の関係
・他にも様々な記法があるから、書くたびに調べる

🔳referemces型
userって書くだけでuser_idの形にしてくれる
indexを自動で貼ってる
foreignキーとセット

◎ajaxの404はurl（行き先）を確認する
500はサーバーが悪いエラー


🔳404 Not Found
ページが見つからない場合に使われるステータスコードです。
画面に大きく「404」と表示されることも多いので一般の方でも知っている方が多いと思います。

人によっては考え方が分かれるところかもしれませんが、私はリソースが見つからないことがクライアントにとって異常なのか正常なのかを考えて404と200を使い分けるようにしています。
イメージしやすいようにいくつか具体例を挙げます。

GET /resources/:idでリソースが見つからない場合
クライアントが存在しないidを指定しているため404を返却

TODOリストを取得するGET /todosでTODOが0件の場合
TODOが0件ということは正常動作なので200を返却

お店検索で絞り込み条件を指定したら0件になった
クライアントが指定した条件に合致するお店がなかったの404を返却
SEO観点でも0件のお店検索結果ページを検索エンジンにインデックスさせたくないので404を指定することでインデックスさせない。

🔳500 Internal Server Error
サーバーで予期せぬエラーが発生した場合に使用します。
プログラムで明示的に500エラーを発生させることはあまりないと思うので、明示的に500エラーを返却している箇所があったら適切なエラーを返却するように修正した方が良いと思います。

🔳謎のmysql消失エラー
mysqlがディレクトリになってない
権限が変わってた？
mysqlと5.6を全部消した
rm -rf mysql
空っぽの残骸を1つずつ消していった。

ohishikaido@ohishi-MacBook-Air mysql % rm -rf .local.pid 
ohishikaido@ohishi-MacBook-Air ~ % brew uninstall mysql@5.6
ohishikaido@ohishi-MacBook-Air var % sudo chown -R "$(whoami)":admin /usr/local/var/mysql
ohishikaido@ohishi-MacBook-Air Cellar % rm -rf mysql  
hishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /usr/local/mysql
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /Library/StartupItems/MYSQL
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /Library/Receipts/mysql-.pkg
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /usr/local/Cellar/mysql*
zsh: no matches found: /usr/local/Cellar/mysql*
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /usr/local/bin/mysql*
zsh: no matches found: /usr/local/bin/mysql*
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /usr/local/var/mysql*
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /usr/local/etc/my.cnf
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /usr/local/share/mysql*
zsh: no matches found: /usr/local/share/mysql*
ohishikaido@ohishi-MacBook-Air ~ % sudo rm -rf /usr/local/opt/mysql*
zsh: no matches found: /usr/local/opt/mysql*
ohishikaido@ohishi-MacBook-Air ~ % cd
ohishikaido@ohishi-MacBook-Air ~ % brew install mysql@5.6
ohishikaido@ohishi-MacBook-Air ~ % mysql.server start