Rails Tutorial 第６版 学習まとめ 第1章

##概要
この記事は私の知識をより確実なものにするためにRailsチュートリアル解説記事を書くことで理解を深め
勉強の一環としています。稀にとんでもない内容や間違えた内容が書いてあるかもしれませんので
ご了承ください。
できればそれとなく教えてくれますと幸いです・・・

出典
[Railsチュートリアル](https://railstutorial.jp/)


##MVCとは
MVCとは
Model　View　Controller　を略したものである

![MVCアーキテクチャの概念図](https://railstutorial.jp/chapters/6.0/images/figures/mvc_schematic.png "MVCアーキテクチャの概念図")
Railsチュートリアル第1章より
https://railstutorial.jp/chapters/beginning?version=6.0#sec-mvc

図の通りブラウザからリクエストがあるとコントローラがリクエストを受け取り
必要なデータはモデルを通してデータベースを照会し、Viewを出力することでページを表示する


##ルートルーティングの設定

config/routes.rb 内に

```root 'controller_name#action_name'```

と記述することで指定したコントローラーのアクションをルートURLとして参照する　


###演習

1.application_controller.rbをこのように書き換える

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  def hello 
    render html: "hello, world!"
  end
end
```

2.省略
3.①application_controller.rbにgoodbyeアクションを追加

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  def hello 
    render html: "hello, world!"
  end
  
  def goodbye
    render html: "goodbye!!!!!!!!!!!!!!!!!!!"
  end
end
```

②routes.rbを書き換えルーティングをgoodbyeアクションへ変更

```ruby:routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  root "application#goodbye"
end
```

##Gitによるバージョン管理

Cloud9を使っているならばGitのインストールは不要

######初期設定
初回のみ初期設定を行う

1.名前とメールアドレスを登録

```
$ git config --global user.name "自分の名前"
$ git config --global user.email your.email@example.com
```

2.Gitで使うデフォルトのエディタを設定
今回の場合はnanoエディタを使う
```$ sudo ln -sf `which nano` /usr/bin```を実行

  
3.エイリアスを設定（しなくてもOK）
git checkout コマンドを今後省略形の　git co で使いたい場合は
設定する
```$ git config --global alias.co checkout```を実行

4.Gitパスワードの保持時間の変更
以降使うことになるpushコマンドなどでパスワードを入力する手間を省くためにパスワードの保持時間を設定する
意識高い人は設定しなくても良い。デフォルトの保持時間は900秒

######リポジトリセットアップ
1. ```git init```でリポジトリを初期化する
2. ```git add -A```で全てのファイルをステージングに追加
3. ```git commit -m "Initialize repository"```でaddしたファイルをコミットする

ここまでがGitの基本的な流れ（ここまではまだローカルマシンでしか保存されていない）

このようにバージョン管理を行うことで以前の状況まで戻りたい時などに
戻れる（超重要！）

↑の作業でローカルマシン上ではコミットしたのでネットワーク上（リモートという）にアップする
リモートにアップすることで完全なバックアップができ、他の作業者とのソースコードの共有が容易になる
リモートでよく使われるものにGithubやBitbucketなどがある
今回はGithubを使用してリモートへアップしてみる

まずはGithubのアカウントを作成し、
新規のリモートリポジトリを作成する

ローカルリポジトリを今作成したリモートリポジトリにアップするコマンドを表示してくれているので
コピーしてターミナルにそのままはりつける

初回はユーザーネームとパスワードの入力を求められる

ちなみにCloud9ではパスワードが入力できない問題があり、私はそれでGithubではなくBitbucketを当初使っていました…

>コンソールに文字の入力ができなくなる
>https://teratail.com/questions/106094

パスワードがセキュリティ対策で表示されなかっただけですね…💦


######ブランチ
gitではブランチというものを扱う。ブランチはリポジトリのコピーで都度使い分けることで
変更や実験を自由に試すことができる
通常、親リポジトリはmasterブランチと呼ばれ（デフォルトはこれ）、今回はREADME.mdを編集するための
お試しブランチとしてmodify-READMEブランチを作成して作業することにする
トピックブランチは```git checkout -b modify-README```で作成できる
※gitの初期設定でエイリアスを設定していた場合はgit co -b modify-READMEでもOK

```
$ git checkout -b modify-README 
Switched to a new branch 'modify-README'
```

ちなみにブランチ一覧は```git branch```で表示される
*がついたブランチが現在のブランチ

```
$ git branch
  master
* modify-README
```

ブランチを作成したのでREADME.mdをさっそく編集

```markdown:README.md

# Ruby on Rails Tutorial

## "hello, world!"

This is the first application for the
[*Ruby on Rails Tutorial*](https://railstutorial.jp/)
by [Michael Hartl](https://www.michaelhartl.com/). Hello, world!
```

編集が終わったらさっそくローカルリポジトリにコミットしてみる
流れとしては```git add -A```でステージングしてから、```git commit -m "~~~~"```コミットである。
```git commmit -a -m "~~~~"```とするとステージングも含めて一緒にやってくれるので便利。
※-aオプションはステージングはしてくれるがバージョン管理下に置く機能はないため
バージョン管理下に置かれていないファイルは```git add```でバージョン管理下に置く必要がある。
-aオプションを使えばいいというわけではない

######merge(マージ)
ファイルの変更が終わり、modify-READMEブランチでコミットしたので
親リポジトリ（masterブランチ）に反映させたい。
他のブランチの内容を現在のブランチに上書きすることをmerge(マージ)と言う。

手順としては、masterブランチにmodify-READMEブランチを反映させたいので
masterブランチに移動→現在のブランチ(masterブランチ)にmodify-READMEブランチをマージとなる
この手順をコマンドで入力した結果がこちら

```
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ git merge modify-README
Updating 392f440..28a415b
Fast-forward
 README.md | 27 +++++----------------------
 1 file changed, 5 insertions(+), 22 deletions(-)
```

```git checkout master```でmasterブランチに移動後
```git merge modify-README```でmasterブランチにmodify-READMEの内容をmergeしている。

トピックブランチを削除することもできるが、必須ではないためここでは省略。

######Push
先ほどローカルでmasterブランチに変更をマージしたのでこれらのファイルをリモートリポジトリにアップする。
このリモートにアップする作業をPushという。
最初の段階で```git push -u origin master```をしているので今回は```git push```で問題ない。

######git pushで問題ない理由
この段階では難しいので、興味がなければスルーしても問題ないですが、
git push -u origin master　の意味について書いておきます。
このコマンドではローカルのmasterブランチで最後にコミットされた内容を
リモートのoriginにpushしますよ！というコマンド。
-uというのはmasterの上流ブランチにoriginを設定しますよというオプション。
まあ簡単に言うと-uで指定するとmasterのデフォルトのpush先がoriginになるため
一度このコマンドでプッシュした後は```git push```だけでデフォルトのプッシュ先
originにmasterの内容をプッシュしてくれるということ。

##デプロイする
######デプロイの準備①
ここまでで一連の流れが終了した。
ファイルを作成→編集→リモートにプッシュ
とりあえず試しで本番環境にデプロイしてみる。
使用するのは手軽なHeroku

使う前に、現在導入しているSQLiteはHerokuではサポートしていないため、
本番環境ではHerokuがサポートしているPostgreSQLを使うよう、Gemファイルを書き換える。

```ruby:Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

gem 'rails',      '6.0.3'
gem 'puma',       '4.3.4'
gem 'sass-rails', '5.1.0'
gem 'webpacker',  '4.0.7'
gem 'turbolinks', '5.2.0'
gem 'jbuilder',   '2.9.1'
gem 'bootsnap',   '1.4.5', require: false

group :development, :test do
  gem 'sqlite3', '1.4.1'
  gem 'byebug',  '11.0.1', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'web-console',           '4.0.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.1.0'
  gem 'spring-watcher-listen', '2.0.1'
end

group :test do
  gem 'capybara',           '3.28.0'
  gem 'selenium-webdriver', '3.142.4'
  gem 'webdrivers',         '4.1.2'
end

group :production do
  gem 'pg', '1.1.4'
end

# Windows ではタイムゾーン情報用の tzinfo-data gem を含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

```bundle install --without production```で本番環境gem以外をインストールする
ローカル環境ではもともとdevelopment環境のためproduction環境のgemは影響しないが
ここでproductionに対してgemを追加したことやRubyバージョンを指定したことをGemfile.lockに
反映させないと、本番環境デプロイで失敗する。

この段階で今の変更もコミットしておく

```
$ git commit -a -m "Update Gemfile for Heroku"
```

######デプロイの準備②
次に、Herokuのアカウントを作成する。→ [Herokuアカウント作成](https://signup.heroku.com/)
続いて、Heroku CLI(Command Line Interface)をインストールする。
Cloud9を使っているならば次のコマンドで即インストール可能だ。

```
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

Heroku CLIがインストールできたがどうかは
```heroku -v```でHerokuのバージョン情報が表示できれば確認できる。

インストールが確認できたらHerokuコマンドで先ほど作成したアカウントにログインする

```
$ heroku login --interactive
```

次に

```
$ heroku create
```

を実行し、Herokuサーバー上に今回作成したアプリケーションの実行場所を作成する。
これで、デプロイしたらブラウザで表示可能になる。

あとはGitを使ってherokuにプッシュすればデプロイできる。

```
git push heroku master
```

ここまでやれば、heroku createコマンドで生成されたアドレスを開けば
hello_appが公開されている。

###演習
1. application_controllerのhelloアクションを書き換え、もう一度今の変更をプッシュする。
2. routes.rbのrootURLをgoodbyeアクションに変更し、もう一度今の変更をプッシュする

######Herokuコマンドについて
herokuには他にも様々なコマンドが用意されている。
heroku renameコマンドではアプリケーションの名前を変更することができる。
実際は自動で生成されるデフォルトアドレスで十分。
RailsチュートリアルもHeroku上に置かれている。
このような独自ドメインも使用可能。

###演習
1. ```heroku help```または```heroku -h```でコマンド一覧を表示する。
Herokuのログは
```heroku logs```で参照可能
2. herokuアプリのアクセスログやエラーログなど様々なログが確認できる


##第一章のまとめ
- RailsはRubyのフレームワーク。
- クラウド環境(Cloud9)はRubyなどの環境があらかじめインストールされているのに加え
　環境の設定も容易でOSが違っても使用できる超有能ツール(環境による差異がない)
- rails コマンドを使えばrails の様々な機能が使える

    - rails server　→ローカルサーバーを立てる
    - rails console　→railsのコンソールを起動する
    - rails new　→railsのアプリを新規で作成する
    - rails generate　→railsのファイルを作成する(モデル・コントローラなど様々)

- RailsやHerokuを組み合わせることでhello_app程度なら一瞬で作れる。超便利。
- データの喪失を防止、複数の作業者と共同作業を行えるようにするため、Gitを使って
　バージョン管理を行う。さらにはGitHubの非公開リポジトリにプッシュする。
- 作成したアプリケーションはHerokuを使って簡単にデプロイできる。