Rails基礎の基礎【復習用】

ちょっとフロントのコーディングを3ヶ月くらいやっただけで、
Railsのファイルのこれってなんだっけ？ってなるので、二度と調べなくていいよう、まとめてます。

#プログラミング基礎知識
###配列とハッシュの違い

#####配列: 複数個の情報を保存することができるリスト

```
siritori = ["りんご", "ゴリラ", "ラッパ", "パセリ"]

//最初の値=0としてインデックスで番号が振り分けられていて、一つずつ取り出せる
siritori[0] = りんご
sitritori[3] = パセリ
```

#####ハッシュ：　複数この情報をキーとバリューに分けて保存できるリスト

```
meibo = {172 = "yuki, 184 = "naoki", 153: "naomi"}

meibo[:172]
=> "yuki"
```

###CRUD(クラッド)
ほとんどのwebアプリケーションで実装されているCreate Read Update Delete機能のこと

#ActiveRecordとは
rubyとデータベースの言語であるSQLを繋ぐ翻訳機のような役割をする。 本来データベースからデータの取得や削除などをおこなうには、SQLのコマンドの実行が必要。 
しかしこのActiveRecordでは、SQLを書かずにRubyコードでデータをとってくることを可能になっている。

| メソッド | 何ができるか |
|:-:|:-:|
|  find | 主キーをもとにデータを取得する  |
| find_by  | 該当する最初のデータを取得する  |
|  where |  該当するデータを全て取得する |
| all | 全てのデータを取得する|

allとfind_byは使いがち。
こんな感じ↓

```nantoka.controller
 def index
    @menus = Menu.all
  end
```

・参考記事：　[Active Recordでデータベースの操作をしてみよう【find・where編】](https://blog.codecamp.jp/rails-activerecord-findwhere#:~:text=%E3%80%8EActive%20Record%E3%80%8F%E3%81%AF%E3%80%81Ruby,%E7%9F%A5%E8%AD%98%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)

#deleteとdestroyの違い
###deleteメソッド: ActiveRecordを使わない
SQLを直接実行することで削除する。
ActiveRecordを使わない＝モデルを経由しないので、モデルで関連付けされているレコードがあったとしても、そちらは削除されない。

###destroy: ActiveRecordを使う
ActiveRecordを介して、指定した条件のレコードを削除するメソッド
モデル内で、dependent: :destoryが設定されていれば、関連付けされているデータも併せて削除される。
ActiveRecordを介しているので、callbackメソッドやバリデーションを機能させることもできる。
例えば、ブログ記事を消してそこに紐づけられているコメントなども削除したい、という場合はdestroyを使う。

・参考記事：　
[[Rails]deleteメソッドとdestroyメソッドの違いについて！！[初心者]
](https://qiita.com/jackie0922youhei/items/588cd6f62cb1ff9e9809)[Rails開発者が採用面接で聞かれる想定Q&A 53問（翻訳）](https://techracho.bpsinc.jp/hachi8833/2020_05_13/91211)

#redirectとrenderの違い

>コントローラを経由するかしないかの違い。
投稿データを保存するという処理をする場合、保存に成功した場合はredirect、失敗した場合にはrenderを使うという使い分け(引用：　[【Rails】redirectとrenderの違いは？](https://qiita.com/koki_73/items/78b8cb2bde7930d55194)

###redirect
リクエスト送信
→ ルーティングでコントローラとアクションを特定
→ 指定のコントローラ内のアクションが動作
→ 動作したアクションに対応するビューファイルがレスポンスとして表示される

###render
指定のビューファイルを表示


#config/credentials.yml
Rails5.2から?導入された秘匿キーなどを隠す場所。credentials.yml.encはmaster keyを利用して暗号化・復号される。
master.keyとcredentialsファイルはrails newしたときに自動で作られ、master.keyはデフォルトで.gitignoreに入っているので、githubから流出する心配も無用。


・参考記事：　
[Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)
[【Rails】credentials.ymlでシークレットキーなどを管理する](https://qiita.com/koki_73/items/2dc70e4a3fb169015884)

#.envファイル=大事な情報を隠すところ
見せちゃいけないAPIログインIDとかを格納する場所。
リモートリポジトリに間違ってもpushしないよう.gitignoreに以下のように必ず記載する。
大体gem dotenv-railsと併用する。

```.gitignore.
/.env
```



#paramsとは
paramsとはユーザー（クライアント）から送られてきたデータが格納されているハッシュのこと。
ユーザーがブラウザ上でHTTPリクエストを送ってきた時、リクエストで送られてくる情報（一部）を パラメーター（paramater）という。
そのparams の中にはリクエストの情報が入っており、情報はハッシュの形で格納されている。

```
変数 = params[:id]
```

#Routing

HTTP動詞はクライアントが行いたい処理をサーバーに伝えるという役割がある。

Railsでは以下の4種類のHTTP動詞がある。

```
・GET・・・サーバーからブラウザに情報を返す。単にウェブサイトを閲覧したいときに利用される。
・POST・・・ブラウザからサーバーにリソースを送信し作成する。フォームでデータを保存したいときに利用される。
・PATCH・・・リソースを更新する。データを更新したいときに利用される。
・DELETE・・・リソースを削除する。データを削除したいときに利用される。

```
#Gem


######Gemfileに記載する際の基本的な文法
・gem 'gem名', 'バージョン', 'オプション' 

例) gem 'rails', '~> 5.1.6'
例) gem 'bootsnap', require: false
※require:falseとは・・・アプリケーションには反映させずに、ターミナルにのみ反映させる。Bundler.requireなどをした時に含まれなくなる(rubocopなど、bundlerによってアプリ側に自動で読み込む必要がないものに指定する)


######Gemのバージョン指定の記号の意味

| 1 | 2 |
|:-:|:-:|
| ・'5.0.0'  | 5.0.0にバージョン固定  |
| ・'>=5.0.0'  | 5.0.0以上  |
| ・'~>5.0.0'  | 5.0.0以上5.9.9以下(メジャーのバージョンが上がるのは不可)  |
| ・'>=5.0.0',  '< 5.3.0'  | 5.0.0以上5.3.0未満のみ使える  |
　　                 　
・参考記事: [初学者がGemのversionを固定しないほうがいい理由](https://bityl.co/6KQ3)

###よく見かけるGem達

・Rubyのアプリケーションサーバ: Unicorn / Puma / Passenger
`rails s`するために必要なやつ。

参考記事: 
[なぜrailsの本番環境ではUnicorn,Nginxを使うのか? 　~ Rack,Unicorn,Nginxの連携について ~【Ruby On Railsでwebサービス運営】](https://qiita.com/takahiro1127/items/fcb81753eaf381b4b33c)
[Rails開発におけるwebサーバーとアプリケーションサーバーの違い（翻訳）](https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3)


######mini_racer
>アセット生成にSprocketsを使う場合は、mini_racerがあると高速に実行できます。
>JavaScriptやCSSのコンパイルに使う各種のツールはJavaScriptで書かれたものが多いので、それらを呼ぶのに何かしらのJavaScript処理系が必要となります。「別にNode.jsを入れる」という選択肢もありますが、プロセス内で処理できるmini_racerのほうが数段速いです。([引用元記事](https://teratail.com/questions/321878))

######ユーザー認証、ログイン: device, sorcery

######環境変数を管理するGem
```Gemfile.
gem 'dotenv-rails'
```
```.env.sample
TWITTER_CONSUMER_KEY=ここにCONSUMER_KEY
TWITTER_CONSUMER_SECRET=ここにCONSUMER_SECRET
```
.envファイルで↑のように設定し、呼び出したいcontrollerファイルなどで`ENV['TWITTER_CONSUMER_KEY']`で呼び出してくる感じ。

・[参考記事](https://naggi.club/rails/%E3%80%90rails%E5%AD%A6%E7%BF%92%E8%80%85%E5%90%91%E3%81%91%E3%80%91%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFparams%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E8%AA%AC%E6%98%8E%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99/)



#yieldメソッドについて
yieldメソッドとは簡単にいうと、一つのレイアウトの中に別のレイアウトを持ってくることができるrubyのメソッド。
railsだとアプリケーションのレイアウトをまとめた「application.html.erb」ファイルが
あるがこのファイルのbodyタブに記載されている。

```application.html.erb
<body>
　<% =yield %>
</body>
```

・参考記事: [yieldメソッドについて](https://bityl.co/6Jjv)

#開発コマンド

###新しいGemを追加した時
bundleインストール後、docker再起動

```
$ docker-compose run web bundle install
$ docker-compose restart
```

[dockerでgemの永続化](https://nishinatoshiharu.com/datavolume-for-gem/#gem)

#参考記事
https://techracho.bpsinc.jp/hachi8833/2020_05_13/91211