RailsTutorialを進めていく中で躓いたことや、ポイントだと感じたこと

# はじめに

こんにちは、Tomuです。今回がQiita初投稿となります。
RailsTutorialを進めていく中で、躓いたことやポイントだと感じたことなどを書いていきます。
間違っていることや気になったことがあれば、気軽にコメントしていただけると幸いです。

# １章
## herokuで変更し、起動コマンド
```sh
git commit -a -m "Update Gemfile for Heroku"
git push heroku master
heroku open
```

## 1章まとめ
- Ruby on Railsとは、Web開発のためのフレームワークであり、Rubyプログラミング言語によって記述されている。
- 事前設定済みのクラウド環境を利用することで、Railsのインストール、アプリケーションの生成、生成されたファイルの編集を簡単に行うことができる。
- Railsにはrailsという名前のコマンドラインコマンドがあり、rails newで新しいアプリケーションを生成したり、rails serverでローカルサーバーを実行したりできる。
- コントローラのアクションを追加したり、ルートルーティングを変更したりするだけで- -「hello, world」アプリケーションを作成できる。
- Gitによるバージョン管理を導入し、Bitbucketの非公開リポジトリにプッシュする理由は、データの喪失を防止し、他の開発者との共同作業を行えるようにするため。
- 作成したアプリケーションをHerokuの本番環境にデプロイした。

[RailsTutorial1章](https://railstutorial.jp/chapters/beginning?version=5.1#cha-beginning)より

# 2章
## 2章まとめ
* Scaffold機能でコードを自動生成すると、Webのあらゆる部分からモデルデータにアクセスしてやりとりできるようになる
- Scaffoldは何よりも手っ取り早いのがとりえだが、これを元にRailsを理解するには向いていない
- RailsではWebアプリケーションの構成にMVC (Model-View-Controller) というモデルを採用している
- Railsが解釈するRESTには、標準的なURLセットと、データモデルとやりとりするためのコントローラアクションが含まれている
- Railsではデータのバリデーション (validation) がサポートされており、データモデルの属性の値に制限をかけることができる
- Railsには、さまざまなデータモデル同士を関連付けを定義するための組み込み関数が多数用意されている
- Railsコンソールを使うと、コマンドラインからRailsアプリケーションとやりとりすることができる

[RailsTutorial２章](https://railstutorial.jp/chapters/toy_app?version=5.1#cha-a_toy_app)より

## 2章でGit関連で躓いたこと

- .ignore ファイルの範囲指定がうまくいっていなかった
- .idea ディレクトリでコンフリクトが起きていたので、ローカルとリモートで削除してrai
- deployブランチでmasterをpull

　を行い解決しました

## 問題点
### herokuでデプロイが出来ていない
原因として考えられるのは
ローカルでは問題なく動いていたので、
herokuの本番環境でデータベースのマイグレーションを行なっていないこと

以下を行い解決しました

```sh
heroku run rails db:migrate
```
をiTermより実行して、本番データベースのマイグレーションを行なった
次にホームページからherokuのデプロイを行なったところ出来た
# 3章

## StaticPagesコントローラを生成する(静的ページの作成)

```
rails generate controller StaticPages home help
```
## 3章まとめ
- 新しいRailsアプリケーションをゼロから作成したのはこれで3度目。今回も必要なgemのインストール、リモートリポジトリへのプッシュ、production環境まで行った
- コントローラを新規作成するためのrailsコマンドはrails generate controller ControllerName アクション名 (省略可)。
- 新しいルーティングはconfig/routes.rbファイルで定義する
- Railsのビューでは、静的HTMLの他にERB (埋め込みRuby: Embedded RuBy) が使える
- 常に自動化テストを使って新機能開発を進めることで、自信を持ってリファクタリングできるようになり、回帰バグも素早くキャッチできるようになる
- テスト駆動開発では「red ・ green ・REFACTOR」サイクルを繰り返す
- Railsのレイアウトでは、アプリケーションのページの共通部分をテンプレートに置くことでコードの重複を解決することができる

[RailsTutorial3章](https://railstutorial.jp/chapters/static_pages?version=5.1#cha-static_pages)より

# 4章

### pメソッド

文字列は、 "" に囲まれて出力されるため、特殊文字(\nや\t)がそのまま出力される

### empty?メソッド

"" の中身が半角スペースであってもfalseとなる

```irb
"".empty?
=> true

" ".empty?
=> false
```

## 4章まとめ
- Rubyは文字列を扱うためのメソッドを多数持っている
- Rubyの世界では、すべてがオブジェクトである
- Rubyではdefというキーワードを使ってメソッドを定義する
- Rubyではclassというキーワードを使ってクラスを定義する
- Railsのビューでは、静的HTMLの他にERB (埋め込みRuby: Embedded RuBy) も使える
- Rubyの組み込みクラスには配列、範囲、ハッシュなどがある
- Rubyのブロックは (他の似た機能と比べ) 柔軟な機能で、添え字を使ったデータ構造よりも自然にイテレーションができる
- シンボルとはラベルである。追加的な構造を持たない (代入などができない) 文字列みたいなもの
- Rubyではクラスを継承できる
- Rubyでは組み込みクラスですら内部を見たり修正したりできる
- 「deified」という単語は回文である

[RailsTutorial4章](https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#cha-rails_flavored_ruby)より

# 5章

## rails testでつまずいたこと
_header.html.erb ファイルで
```<%= link_to "sample app", root_path, id: "logo" %>```
の文が
```<%= link_to "sample app", 'root_path', id: "logo" %>```
となっていたため、root_path  が見つからないとエラーが出ていた

```ruby:_header.html.erb
<header class="navbar navber-fixed-top navbar-inverse">
<div class="container">
    <%= link_to "sample app", root_path, id: "logo" %>
    <nav>
    <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home", root_path %></li>
        <li><%= link_to "Help", help_path %></li>
        <li><%= link_to "Log in", '#' %></li>
    </ul>
    </nav>
</div>
</header>
```    

## ５章まとめ
- HTML5を使ってheaderやfooter、logoやbodyといったコンテンツのレイアウトを定義しました
- Railsのパーシャルは効率化のために使われ、別ファイルにマークアップを切り出すことができます
- CSSは、CSSクラスとidを使ってレイアウトやデザインを調整します
- Bootstrapフレームワークを使うと、いい感じのデザインを素早く実装できる
- SassとAsset Pipelineは、(開発効率のために切り分けられた) CSSの冗長な部分を圧縮し、本番環境に最適化した結果を出力する
- Railsのルーティングでは自由にルールを定義することができ、また、その際に名前付きルートも使えるようになる
- 統合テストは、ブラウザによるページ間の遷移を効率的にシミュレートする

[RailsTutorial5章](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#cha-filling_in_the_layout)より

# 6章


## Userモデル

Model-View-Controller (MVC)のMに該当する

Rails にはマイグレーション(Migration)があるため、データ定義をRubyで行うことができる
- そのため、SQLのDDL(CREATE（表の創成、定義）、DROP（表の削除）など)を新たに学ぶ必要がない。

開発環境では、SQLite

本番環境では、PostgreSQL を用いる

### Userモデルを生成

`$ rails generate model User name:string email:string`

### マイグレーションのロールバック(rollback)
 `$ rails db:rollback`

### オブジェクトの継承の確認
`>> user.new`

`=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>`

`>> User.superclass`

`=> ApplicationRecord(abstract)`

`>> ApplicationRecord.superclass`

`=> ActiveRecord::Base`
### emailに関するエラー情報のみ取得

`>> u.errors.messages[:email]`

`=> ["can't be blank"]`
### 配列の簡単な作成メソッド　%w

`>> %w[foo bar baz]`

`=> ["foo", "bar", "baz"]`

### 正規表現エディタ　Rubular

[Rubylar]
(http://www.rubular.com/)

## 6章まとめ
- マイグレーションを使うことで、アプリケーションのデータモデルを修正することができる
- Active Recordを使うと、データモデルを作成したり操作したりするための多数のメソッドが使えるようになる
- Active Recordのバリデーションを使うと、モデルに対して制限を追加することができる
- よくあるバリデーションには、存在性・長さ・フォーマットなどがある
- 正規表現は謎めいて見えるが非常に強力である
- データベースにインデックスを追加することで検索効率が向上する。また、データベースレベルでの一意性を保証するためにも使われる
- has_secure_passwordメソッドを使うことで、モデルに対してセキュアなパスワードを追加することができる

[RailsTutorial6章](<https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-modeling_users_what_we_learned_in_this_chapter>)より

*随時更新していきます*