Rails初学者によるRailsチュートリアル学習記録③ 第1章

#目次
- [1. はじめに](#1-はじめに)
- [2. 第1章の概要](#2-第1章の概要)
- [3. 学習内容](#3-学習内容)
- [4. 終わりに](#4-終わりに)

#1. はじめに
- この記事は、Rails初学者の工業大学三年生がRailsチュートリアルの学習記録を<br>つけるための記事です。
- 筆者自体がRailsやWebについて知識が少ないので、内容の解釈などに<br>間違いがある可能性があります。(その時はコメントで指摘してくださると助かります！)
- Railsチュートリアル内ではRailsの内容以外にも、gitでのバージョン管理やHerokuを使ったデプロイも<br>学習しますが、gitに関しては既に私が学習済みのため学習記録には記述しません。
- 演習の記録も省略します。

#2. 第1章の概要
1. AWS Cloud9を使った開発環境の準備
    1. 必要なgem, プログラムのインストール
    1. 最初のアプリケーションの作成
1. Railsアプリケーションの仕組みについて
    1. コントローラとアクションについて
    1. ルーティングについて
1. Herokuへのデプロイ
    1. Herokuへのデプロイの準備、デプロイ
    1. 開発環境の変更を本番環境に反映させる方法

#3. 学習内容
###1. AWS Cloud9を使った開発環境の準備
AWSのアカウントの作成～ワークスペースの作成までの説明は省略します。
####1-1. 必要なgem, プログラムのインストール
###### ①Rubyドキュメントのインストールをしない設定にする
gemのインストール時などにドキュメントをインストールしているとその分時間がかかってしまうので、
コマンドラインで`$ echo "gem: --no-document" >> ~/.gemrc`を実行して、
ドキュメントをインストールしない設定に変更します。

###### ②バージョンを指定してRailsをインストールする
`$ gem install rails -v 6.0.3`を実行してRailsをインストールします。
インストールできたかどうかは、`$ rails -v`を実行してバージョンが表示されるかで確認できます。

###### ③Yarnをインストールする
`$ source <(curl -sL https://cdn.learnenough.com/yarn_install)`を実行して
Yarnというプログラムをインストールします。
YarnはJavaScriptのソフトウェアの依存関係を管理するプログラムで、上記のコマンドは
<strong>クラウドIDEで開発するときに使用できるCDN経由</strong>のダウンロード、セットアップとなります。
ネイティブOSで開発するときはOSごとのインストール方法に従うことになります。
以上で、RailsでWeb開発を行う準備は完了です。

####1-2. 最初のアプリケーションの作成
######①Rails newを実行してアプリケーションを作成する
どのRailsアプリケーションでも`rails new`コマンドを実行するところから始まります。
実行すると指定したディレクトリにアプリケーションの原型が作成されます。
Railsチュートリアルでは`$ rails _6.0.3_ new hello_app`と書くことで、バージョンを指定してhello_appという
アプリケーションを作成します。

######②Bundlerを使ったgemのインストール
Bundlerとは、gemの互換性を保ちながらgemの導入や管理を行ってくれるライブラリです。
Gemfileに使用したいgemやバージョンを記述して`bundle install`や`bundle update`を実行します。
Railsチュートリアルでは、`gem 'gem名', 'バージョン'`という表記になっています。
この表記方法だと、指定したバージョンのgemをインストールしてくれます。
バージョン指定の方法は他にもあり、`gem 'gem名', '>= バージョン'`だと指定したバージョン以上で最新のgemを
インストールしてくれます。
`gem 'gem名', '~> バージョン'`だと指定したメジャーバージョンかつマイナーバージョンかパッチバージョンが
最新のgemをインストールしてくれます。
今回はRailsチュートリアル内のGemfileと同じように書き替えて、bundle installを実行します。

######③rails serverの実行
ここまでで、実際に動かせるアプリケーションが作成されたため`rails server`を実行することで、
アプリケーションが正しく動くかを確認することができます。

###2. Railsアプリケーションの仕組みについて
####2-1. コントローラとアクションについて
###### ①コントローラとは
コントローラはWebサーバーへのリクエストを処理します。
チュートリアル内でもう少し先に出てくるモデルと通信して、データベースの情報を受け取ったり、
そのデータをビューに渡して動的なページを作ってもらって受け取ったりします。

###### ①アクションとは
アクションとはコントローラ内で定義されるもので、この段階ではrenderメソッドを使って
htmlで文字列を表示させています。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
    def hello #applicationコントローラ内のhelloアクション
        render html: "Hello!" #Hello!という文字列を表示
    end
end
```

今後、ビュー内で使用する変数を定義するためにも使います。

####2-2. ルーティングについて
ルーティングとはブラウザからのリクエストをコントローラに振り分ける役割を持ちます。
今のところは、URLとコントローラを対応付けるという認識です。
ここでは、ルートURLと呼ばれるhttp://www.example.com/ または「/」といったURLへのアクセスを
どのコントローラに割り振るかを定義します。

```ruby:routes.rb
Rails.application.routes.draw do
  root 'application#hello'
end
```

上記のコードではルートURLに対するアクセスをapplicationコントローラ内のhelloアクションに割り振っています。
以上が第1章のアプリケーション作成についての内容です。

###3. Heokuへのデプロイ
gitへのプッシュ、Herokuのアカウント作成は省略します。
####3-1. Herokuへのデプロイの準備、デプロイ
######①開発環境と本番環境で使うデータベースの設定
Railsチュートリアルの開発環境ではSQliteというデータベースを使用するのですが、Herokuの本番環境では
SQliteが使用できないため、PostgressSQLというデータベースを使用します。
その設定をするためにGemfileに変更を加えます。

```ruby:Gemfile

group :development, :test do #開発環境で使用するgemを指定するグループ
  gem 'byebug', '11.0.1', platforms: [:mri, :mingw, :x64_mingw]
  gem 'sqlite3', '1.4.1' #SQlite用のgem
end

group :production do #本番環境で使用するgemを指定するグループ
  gem 'pg', '1.1.4' #PostgressSQL用のgem
end
```
Gemfileを変更したので`bundle install`を実行して準備完了です。

######②Herokuのインストール、デプロイ
`source <(curl -sL https://cdn.learnenough.com/heroku_install)`を実行して、Herokuをインストールします。
その後heroku loginコマンドでHerokuにログインします。

Herokuにログインできたら、`heroku create`というコマンドを実行して、herokuサーバー上に
アプリケーションの実行場所を作成します。
その後、`git push heroku master`を実行することで、ローカルリポジトリの内容をHerokuにデプロイすることができます。

####3-2. 開発環境の変更を本番環境に反映させる方法
これ以降、開発環境で変更を行い、それを本番環境に反映したいときには、
3-1に沿って、`git commit -a`でコミットを行い`git push`でリモートリポジトリに変更内容をプッシュした後、
`git push heroku master`を実行してローカルリポジトリの内容をHerokuにプッシュします。

#4. 終わりに
第1章はまだ躓く個所はなく、かかった時間は約4時間ほどでした。
この記事を書くのにかかった時間が約2.5時間程でちょっと長いと感じたので、次から密度を下げたいなと思っています。
以降の内容も、1章分終わったらQiitaに記事を投稿という流れで進めていきます。
(内容が多い章は記事を2つに分けることも考えています)