Ruby on Rails チュートリアルで学んだことを残しておく

　今回は、初投稿ということもあり、見にくい箇所等があると思いますが、お許しください。本投稿では、[https://railstutorial.jp/](https://railstutorial.jp/)で学んだことを列挙していきたいと考えています。間違った箇所等ございましたら、ご指摘してくださるとありがたいです。

#第１章 Railsの環境構築 +  heroku


##1. Railsの環境構築

- Rails のインストール

```
$ gem install rails -v 5.0.3
```

- アプリケーションの実行

 ```
$ rails _5.0.3_ new アプリケーション名
```

- Gemfileの編集<br>

　development環境とproduction環境で、利用するデータベースを異なるものにするために、Gemfileを以下のように変更する。この場合、development環境ではsqlite3、production(本番)環境ではPostgreSQLを利用する。

```rb:Gemfile
source 'https://rubygems.org'

gem 'rails',        '5.0.3'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.6.4'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.0.8'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

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

# Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

- Railsサーバーの立ち上げ方 

　ローカル上で、サーバーを立ち上げる時は、<br>

```
$ rails server 
```

　クラウドIDE上で、サーバーを立ち上げる時は、

```
$rails server -b $IP -p $PORT
```

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

　Gitを使用する前に、設定を一回だけ行う必要がある。以下のコマンドを入力する。

```
$ git config --global user.name "名前"
$ git config --global user.email メールアドレス
```
　次に、新しいレポジトリの初期化を行い、プロジェクトのファイルをリポジトリに追加する。

```
$ git init
$ git add -A
```

　Gitにファイルを追加すると、ステージングという待機用リポジトリに追加され、コミットを待つ。安全のために、いきなりコミットするのを防いでいる。ステージングの状態を知るためには、以下のコマンドを入力する。

```
$ git status
```

　ステージングエリアで控えているファイルをコミットするためには、以下のコマンドを入力する。

```
$ git commit -m "コミット内容"
```

　ここで、-mとすることで、コミットメッセージを直接指定できる。-mを利用しない場合は、デフォルトでエディタが開き、そこでコミット内容を入力することができる。コミットの履歴を参照するためは、以下のコマンドを入力する。

```
$ git log
```

　万が一、ファイルを誤って削除してしまった場合には、以下のコマンドで削除前の状態に戻すことができる。-fとは強制的に上書きして元に戻すためのフラグである。

```
$ git checkout -f
```

　ブランチとは、リポジトリのコピーで、元のファイルを触れずに新しいコードを書くときなど、自由に変更することができる。通常、親リポジトリは*master*ブランチといい、他のブランチを作成して、そこでの変更がうまくいけば、*master*ブランチにマージする。

```
$ git branch ブランチ名
$ git checkout ブランチ名
```

とすることで、ブランチを切り替える。ブランチに切り替えた状態で、コミットを行い、それを*master*ブランチにマージする(統合する)ためには、

```
$ git checkout master
$ git merge [マージするブランチ名]
$ git push origin master
```

このとき、origin masterは省略して、git pushだけでもプッシュできる。

##3. Bitbucketにソースコードをアップロードする
　Bitbucketにソースコードをプッシュすることにより、ソースコードのバックアップ・他の開発者との共同作業を可能にする。Gitリポジトリを扱うサービスとして、GitHubとBitbucketがある。Bitbucketは無料でリポジトリを非公開にできるため、今回はBitbucketを利用する。

　Bitbucketでプロジェクトを開始するための手段を以下に述べる。
1. Bitbucktアカウントの作成
2. 公開鍵をクリップボードにコピーする
　クラウドIDEを利用している場合、以下のコマンドで公開鍵を取得できる

```
$ cat ~/.ssh/id_rsa.pub
```

3.Bitbucketに公開鍵を追加する。右上にあるアバター画像をクリックして、[Bitbucket settings]、[SSH keys]を選択する。
4.Bitbuckeで、新しいレポジトリの作成を行う。

　ここまで、行えばローカル環境でのレポジトリをBitbucketにあるリモートリポジトリへプッシュすることができる。その時のコマンドは、

```
$ git remote add origin git@bitbucket.org:<username>/リポジトリ名.git
$ git push -u origin --all
```

## 4. デプロイする
　まず、[デプロイとは](http://www.weblio.jp/content/%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)、主にネットワークを通じて提供されるWebアプリケーションなどのシステム開発工程において、システムを利用可能な状態にすることである。Herokuは、ソースコードをバージョン管理にGitを使用していれば、Railsアプリケーションを簡単にデプロイすることができる。Herokuでは、PostgreSQLデータベースを使用するため、以下のようにGemfileを編集する必要がある。

```rb:Gemfile
source 'https://rubygems.org'

gem 'rails',        '5.0.3'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.6.4'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.0.8'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

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

# Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```
編集が終わったら、

```
$ bundle install --without production
```

を入力する。--without producitionとすることでローカル環境には本番環境用のgemをインストールしないようにする。次に、Herokuのユーザー登録を行う。クラウドIDEを使用していない場合は、Heroku Toolbeltをインストールする必要がある。herokuコマンドでSSHキーを入力する。

```
$ heroku login
$ heroku keys:add
```

Herokuサーバーにアプリケーションの実行場所を作成する。

```
$ heroku create
```
Herokuにデプロイするために、Gitを用いて

```
$ git push heroku master
```

とする。

```
$ heroku rename [変更名]
```

とすることで、アプリケーション名を変更することができる。

#第２章 Toyアプリケーションの作成
##1. Scaffold機能によるアプリケーション作成
　まず、アプリケーションの作成を行う。

```
$ rails _5.0.3_ new toy_app
```

　１章と同様に、Gemfileを同じように変更し、gemのインストールを行う。

```
$ bundle install --without production
```

　Gitで、このアプリケーションのバージョン管理を行う。

```
$ git init
$ git add -A
$ git commit -m "first commit"
```

　Bitbucketにも、リポジトリを作成し、プッシュする。

```
$ git remote add origin git@bitbucket.org:<username>/アプリケーション名.git
$ git push -u origin --all
```

　Hello,worldを表示するために、アクションの定義・ルーティングを行う。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
 protect_form_forgery with: :exception
 
 def hello
  render html: "Hello, world"
 end

end
```

```config/routes.rb
Rails.application.routes.draw do

 root 'application#hello'

end
```

　ファイルの編集を行ったら、コミットし、Herokuにプッシュする。

```
$ git commit -am "Add hello"
$ heroku create
$ git push heroku master
```

　次に、モデル及びビュー作成を行う。モデルとして、ユーザーモデルとマイクロポストモデルを作成する。ユーザーモデルの役割は、ユーザーの情報を管理する。マイクロポストモデルの役割は、ユーザーが投稿した内容の情報を管理する。各モデルが持つ属性値を次に示す。

|    ユーザーモデル    |    マイクロポストモデル    |
|:------------------:|:------------------:|
|        id : integer        |        id : integer        |
|       name : string      |       content : text       |
|        email : string        |        user_id : integer        |

　以上のモデルを作成するために、scaffold機能を利用する。

```
$ rails g scaffold User name:string email:string
$ rails db:migrate  

$ rails g scaffold MicroPosts content:text user_id:integer
$ rails db:migrate
```

　マイクロポストを投稿するときに、文字数制限(最大文字数が140)を加える。

```app/models/micropost.rb
class Micropost < ApplicationRecord

 validates :content, length: {maximum: 140}

end
```

　異なるデータモデル同士の関連付けを行う。ここでは、一人のユーザーに対して、複数のマイクロポストを持つとする。このことをコードで書くと、

```app/models/user.rb
class User < ApplicationRecord

 has_many :microposts

end
```

``` app/models/micropost.rb
class Micropost < ApplicationRecord

 belongs_to :user

 validates :content, length: {maximum: 140}

end
```

モデルの関連付けを行うことにより、TwitterのようなSNSが作成可能となる。次に、マイクロポストのコンテンツが存在しなければならない制限をかける。また、ユーザーモデルのバリデーションを追加する。

``` app/models/micropost.rb
class Micropost < ApplicationRecord

 belongs_to :user

 validates :content, length: {maximum: 140}, presence: true

end
```

```app/models/user.rb
class User < ApplicationRecord

 has_many :microposts

 validates :name, presence: true
 validates :email, presence: true

end
```

##2. コントローラとモデルのクラス階層
　モデルの継承構造について述べる。User、Micropostモデルは共にApplicationRecordクラスを継承している。また、ApplicationRecordクラスは、ActiveRecord::Baseクラスを継承している。よって、作成したモデルオブジェクトはデータベースにアクセスすることが可能となり、データベースのカラムをRubyの属性値かのように扱うことが可能となる。
　次に、コントローラの継承構造について述べる。Users、Micropostsコントローラ共にApplicationControllerクラスを継承している。また、ApplicationControllerクラスは、ActionController::Baseクラスを継承している。よって、Applicationコントローラで定義したルールは、アプリケーションの全てのアクションで反映される。

##3. アプリケーションのデプロイ
　以上の内容を、Bitbucketとherokuに反映させる。

```
$ git status                      //ステージング状態の確認
$ git add -A                      //ファイルを全てステージング状態にする
$ git commit -m "Finish toy app"  //コミット
$ git push                        //Bitbucketにプッシュ                       
$ git push heroku                 //herokuにプッシュ
$ heroku run rails db:migrate     //herokuのデータベースに反映させる
```