Railsチュートリアル（第4版） まとめ 

# はじめに

プログラミング歴１１ヶ月の私が、Railsチュートリアル（第4版）を６日間で完走した感想です。
１周では理解できない部分が多々あったので（特に9章以降）、２周目をやる前にまとめようと思い、備忘録を書きます。

ちなみに、Railsチュートリアルをやる前の私の状態は、下記の通りとなっています。

>- Progateで、Command Line / Git / HTML / CSS / Sass / JS / JS(ES5) / jQuery / Node.js / SQL / Ruby / Ruby on Rails5 を１周〜２周。
>  （総演習クリア数992 / 修了レッスン数53 / Lv.296）

>- プログラミングスクールで、HTML / CSS / Ruby / Railsを使ってチーム開発でECサイト、ポートフォリオで投稿型Webアプリを作成。
>- PaizaでD・Cランクの問題をRubyで約100問解答。
>- Railsなどで作成したアプリケーション、ホームページ：３つ。
（実装機能：投稿・いいね・コメント・フォロー等）

### 所感

１〜８章までは、全体的に理解しながら進むことができましたが、９章から難しくなり一度読むだけでは理解できないことが増えました。
それでも、やり切ることが大切かと思ったので、わからない部分はメモをして、グイグイ進めました。
勢いとやる気と体力が必要な教材でしたが、細かいところまで丁寧に書かれていて、非常にわかりやすかったです。

（例えば、コマンドで下記のように実行するよう書かれていた場合、「>  はターミナル上自動で出力されるので、書かなくていいです。」と毎度丁寧に教えてくれる。）


```ruby:ターミナル
%　XXXXXXXX　/
> XXXXXX
```
## 進め方

手を動かしながらやらないと頭に入らないので、開発環境・本番環境で動かしながら進めました。
また、演習も全て解きながら進めました。

## 各章まとめ
| 各章 | タイトル | かかった時間 |
|:-----------|------------:|:------------:|
| １章　      | ゼロからデプロイまで     | 4h30m       |
| ２章     | Toyアプリケーション      | 2h30m       |
| ３章       | ほぼ静的なページの作成        | 2h        |
| ４章       | Rails風味のRuby          | 11h           |
| ５章      | レイアウトを作成する       | 3h      |
| ６章    | ユーザーのモデルを作成する     | 5h      |
| ７章　      | ユーザー登録     | 4h       |
| 8章     | 基本的なログイン機構      | 3h30m       |
| 9章       | 発展的なログイン機構        | 3h30m        |
| 10章       | ユーザーの更新・表示・削除          | 3h30m           |
| 11章      | アカウントの有効化       | 3h      |
| 12章    | パスワードの再設定     | 3h30m      |
| 13章       | ユーザーのマイクロポスト          | 3h30m           |
| 14章      | ユーザーをフォローする       | 3h      |

合計時間：55h30m　（約9h/日）


### １章：ゼロからデプロイまで
最初のインストールで詰まってしまった。

- 演習問題数：４題


**【発生したエラー】**
①[1.2.2 Railsをインストールする](https://railstutorial.jp/chapters/beginning?version=6.0#sec-installing_rails)にて、Railsをインストールできなかった。
原因：下記のエラーから、rbenvのRubyではなく、システムのRubyのgemコマンドを実行している。

```ruby:ターミナル
% gem install rails -v 6.0.3  
ERROR: While executing gem ... (Gem::FilePermissionError)
  You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
```

下記のコマンドを実行。

```ruby:ターミナル
% rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:
eval "$(rbenv init -)"
```
~/.zshrcにeval "$(rbenv init -)"を追記するために、ターミナルで下記のコマンドを実行。
無事、インストール成功。

```ruby:ターミナル
% echo 'eval "$(rbenv init -)"' >> ~/.zshrc
```

②gemのインストールができなかった
エラー文に書いてあるように、`% bundle update`で解決。

```ruby:ターミナル
Bundler could not find compatible versions for gem "selenium-webdriver":
  In Gemfile:
    selenium-webdriver (= 3.142.4)

    webdrivers (= 4.1.2) was resolved to 4.1.2, which depends on
      selenium-webdriver (>= 3.0, < 4.0)

Bundler could not find compatible versions for gem "sprockets":
  In snapshot (Gemfile.lock):
    sprockets (= 4.0.2)

  In Gemfile:
    sass-rails (= 5.1.0) was resolved to 5.1.0, which depends on
      sprockets (>= 2.8, < 4.0)

    rails (~> 6.0.3, >= 6.0.3.4) was resolved to 6.0.3.4, which depends on
      sprockets-rails (>= 2.0.0) was resolved to 3.2.2, which depends on
        sprockets (>= 3.0.0)

Running `bundle update` will rebuild your snapshot from scratch, using
only
the gems in your Gemfile, which may resolve the conflict.
```

>もしGemfileで指定されているのと異なるバージョンのgem (Rails自身のgemなど) をインストールしていた場合は、bundle updateを実行してgemを更新 (update) し、gemのバージョンを合わせておくとよいでしょう。

チュートリアル [3.1 セットアップ](https://railstutorial.jp/chapters/static_pages?version=6.0#sec-sample_app_setup)より

### 2章：Toyアプリケーション
バージョン指定のアプリ作成ができず詰まってしまった。

- 演習問題数：7題


**【発生したエラー】**

① `% rails　_5.1.6_ new toy_app` ができなかった
原因：環境に指定したrailsのバージョン（ 5.1.6 ）が入っていなかった。
下記のコマンドで指定のバージョンをインストールして解決。

```ruby:ターミナル
% gem install rails -v 5.1.6
% rails _5.1.6_ new toy_app
```

### 3章：ほぼ静的なページの作成
HTMl / CSS / テストがメイン。特に詰まることなく進んだ。

- 演習問題数：5題


### 4章：Rails風味のRuby
オブジェクト・クラス・インスタンス・シンボルなど、完全に理解してない部分がたくさん出てきて、
一度で全てを理解しきれず進みが一番遅い章だった。

- 演習問題数：11題


**【発生したエラー】**
①[4.4.5 ユーザークラス](https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#sec-a_user_class)で使用するアプリがtoy_appからsample_appになっていたので、エラーが発生していた。toy_appに変更したら解決した。


**【理解が難しかったところ・調べた用語・参考記事】**

- モジュールについて
- 破壊的メソッドについて
- リテラルコンストラクタがいまいちわからない（[4.4.1 コンストラクタ](https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#sec-constructors) が理解難しい…）

（参考記事：[Railsチュートリアル 第4章 - Rails風味のRubyを学ぶ…クラス](https://qiita.com/rapidliner00/items/bd120d6fcc1c6284e4ab#:~:text=%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF,%E3%81%A8%E5%91%BC%E3%82%93%E3%81%A7%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)）


### 5章：レイアウトを作成する
特に詰まることなく進んだ。実際の画面を確認しながら進められるので、やっていて楽しかった。

- 演習問題数：９題


**【理解が難しかったところ・調べた用語・参考記事】**

- アセットパイプラインについて

（参考記事：[Rails初学者がつまずきやすい「アセットパイプライン」](https://diveintocode.jp/blogs/Technology/AssetPipeline)）

- マニフェストファイルについて
- RESTの考え方

### 6章：ユーザーのモデルを作成する
正規表現が出てきた。一度、正規表現に関する記事を読んだだけだったので、再度復習しなければと思った。
演習を結構間違えてしまった。

- 演習問題数：13題


**【理解が難しかったところ・調べた用語・参考記事】**

- リレーショナルデータベース
- マイグレーション
- sandboxモード
- valid?メソッド
- assertメソッド
- :uniqueオプション
- dup(同じ属性を持つデータを複製するためのメソッドです)
- コールバック (callback) メソッド
- digest(暗号化用ハッシュ関数という用語が語源です)
- bcrypt gem
- authenticateメソッド


### 7章：ユーザー登録
理解が難しい文章が出てくるようになった。

- 演習問題数：14題


**【理解が難しかったところ・調べた用語・参考記事】**

- ハッシュ化
- hexdigestメソッド
- asideタグ
- pluralizeという英語専用のテキストヘルパー

### 8章：基本的なログイン機構 
タイプミスでのエラーが多かった。

- 演習問題数：10題

**【発生したエラー】**
①下記のエラーが発生していた。
原因：path名を間違えていた。

```ruby:ターミナル
ActionController::RoutingError:         ActionController::RoutingError: No route matches [POST] "/signup"
            test/integration/users_signup_test.rb:7:in `block (2 levels) in <class:UsersSignupTest>'
            test/integration/users_signup_test.rb:6:in `block in <class:UsersSignupTest>'
  19/19: [=====================================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.61060s
19 tests, 39 assertions, 0 failures, 1 errors, 0 skips
```

```ruby:test/integration/users_signup_test.rb
post users_path, params: {user: {name: "", email: "user@invalid", password:    "foo", password_confirmation: "bar"}}
```

なのに、

```ruby:test/integration/users_signup_test.rb
post signup_path, params: {user: {name: "", email: "user@invalid", password:    "foo", password_confirmation: "bar"}}
```

としていた。

②下記のエラーが発生していた。
原因：current_userがcuttent_userになってただけだった。

```ruby:app/views/layouts/_header.html.erb
NameError in Users#show
Showing /Users/XXX/Desktop/Rails_tutorial/environment/sample_app/app/views/layouts/_header.html.erb where line #8 raised:
undefined local variable or method `current_user' for #<#<Class:0x00007fe0eb540190>:0x00007fe0f2883f58>
Did you mean?  cuttent_user
```

**【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】**

- fixture (フィクスチャ)
- bcrypt
- digestメソッド
- app/helperってどんな役割だったけ、と。

（参考記事：[rails helper 基本](https://qiita.com/yukiyoshimura/items/f0763e187008aca46fb4)）

### 9章：発展的なログイン機構
ここから、１〜８章でなんとか覚えた用語が多発する。

- 演習問題数：7題

**【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】**

- 記憶ダイジェスト
- 記憶トークン
- model とhelperの違いってなんだっけ、と。



### 10章：ユーザーの更新・表示・削除
演習がほぼミスだったし、解答をみても１回で理解できなかった…。


- 演習問題数：15題

**【発生したエラー】**

①ドキュメント通りやってたら、userないよってエラー！
すべてに、＠をつけたら解決。
（参考記事：[Rails Tutorial10章 10.32のテストが通りません](https://teratail.com/questions/141284)）

```ruby
def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if @user && @user.authenticate(params[:session][:password])
    log_in @user
    params[:session][:remember_me] == '1' ? remember(@user) : forget(@user)
    redirect_back_or @user
    else
（略）
```

@なしでやると下記のエラー発生。

```ruby
ERROR["test_login_with_remembering", UsersLoginTest, 0.6073389999801293]
 test_login_with_remembering#UsersLoginTest (0.61s)
NoMethodError:         NoMethodError: undefined method `remember_token' for nil:NilClass
            test/integration/users_login_test.rb:43:in `block in <class:UsersLoginTest>'

  30/30: [=====] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.80407s
30 tests, 82 assertions, 0 failures, 1 errors, 0 skips
```



**【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】**

- controllerは_pathではなく_urlなのはどうして？？
- toggle!メソッド

### 11章：アカウントの有効化
メールの部分、一度で理解できずに進めていたが、12章で動作確認する際に、再度11章を読み直したら１回目よりも理解できた。
２回・３回やることの大切さを実感。

- 演習問題数：9題

**【発生したエラー】**

①　`<%= form_for(@user, url: yield(:url)) do |f| %>　`
としていたところ、ユーザー新規登録で下記のエラー発生。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664818/7155743c-5f7e-4fec-8a37-901ddd6dc8bf.png)

参考記事

- [post '/signup'は必要ですか？](https://teratail.com/questions/112263)
- [Railsチュートリアル [第7章〜第8章] ユーザー登録でRouting Errorになる](https://qiita.com/ebichiki/items/c1d637dad66a50a1db55)

→Routes.rb で postの/signupを作成するのはチュートリアルではそうしていないため、違うのではないかと。

- [【Railsチュートリアル】パーシャル実装によるルーティングの不正](https://teratail.com/questions/66002)　を読んでrouting errorはなくなったが、testでエラー発生。テストのエラー解消を優先して、そのまま進める。
13章で再度、routing error解決していたので、下記をコメントアウトした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664818/a5f285f2-9b77-296e-ea23-94ac042d19b7.png)
￼


￼

### 12章：パスワードの再設定
herokuでメール送信のための設定を行わなかった。
何十分も悩むエラーは発生しなかった。

- 演習問題数：9題


### 13章：ユーザーのマイクロポスト
最後の演習がすごく難しかった。解けなかった。

- 演習問題数：１５題

**【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】**

- default scopeの使い方
- find   と　find_by の違いってなんだっけ、と。



### 14章：ユーザーをフォローする
フォロー・フォロワーの関係は一度調べて図に書くと整理できます。

- 演習問題数：１4題

**【発生したエラー】**

①herokuでApplication error。
原因：13.4.4 本番環境での画像アップロードにて、中途半端に下記のコードを追加していたのでエラー発生していた。その部分を削除したら、無事にデプロイできた。

```ruby:app/uploaders/picture_uploader.rb
class PictureUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  process resize_to_limit: [400, 400]

  if Rails.env.production?
    storage :fog
  else
    storage :file
  end
```
下記が発生したエラー。

```ruby
Application error
An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details. You can do this from the Heroku CLI with the command heroku logs --tail
```


**【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】**

- 複合キーインデックス
- :memberメソッド
- JavaScriptを前面に出すべからずという哲学
- ステータスフィード


# 終わりに

「プログラミングを勉強しよう！言語は、Ruby・Railsにしよう！まずは公式っぽいRailsチュートリアルからやろう！」としてる方は、挫折しそうだなって思いました。
Progateをやって、１つRailsでアプリを作成してデータの受け渡しなどをある程度理解できてからやると、非常に勉強になるなと思いました（それでも、後半挫折しそうでした）。


２周目できたら、「Railsチュートリアル（第4版） まとめ ２」として記事を書きたいと思います。
まとめ２　では後半の章について詳しくかけたらいいなと思います。


## 参考記事（まとめ）

- [Railsチュートリアル 第4章 - Rails風味のRubyを学ぶ…クラス](https://qiita.com/rapidliner00/items/bd120d6fcc1c6284e4ab#:~:text=%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF,%E3%81%A8%E5%91%BC%E3%82%93%E3%81%A7%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
- [Rails初学者がつまずきやすい「アセットパイプライン」](https://diveintocode.jp/blogs/Technology/AssetPipeline)
- [rails helper 基本](https://qiita.com/yukiyoshimura/items/f0763e187008aca46fb4)
- [Rails Tutorial10章 10.32のテストが通りません](https://teratail.com/questions/141284)
-  [post '/signup'は必要ですか？](https://teratail.com/questions/112263)
- [Railsチュートリアル [第7章〜第8章] ユーザー登録でRouting Errorになる](https://qiita.com/ebichiki/items/c1d637dad66a50a1db55)
- [【Railsチュートリアル】パーシャル実装によるルーティングの不正](https://teratail.com/questions/66002)

演習の解答答え合わせで、非常にお世話になった記事

- [コジマノテック エンジニアとしての経験や学習を発信していくブログ](https://kojimanotech.com/)
- [エンジニアになりたい肉体労働者](https://yukitoku-sw.hatenablog.com/)
- [Ruby on Rails チュートリアル 完全攻略 概要と演習解答総まとめ](http://mochikichi.hatenablog.com/entry/rails_tutorial_guide)