ProgateのRuby on Rails終えたので、コメント投稿アプリを作ってみた

##はじめに
この記事ではRuby on Railsで初めてアプリを作ってみたい人向けに、自分が開発をしていく中で環境構築やデプロイなど詰まったところを書いていきます。

実際に作ったアプリはこちら → [Comment](https://test201909081413.herokuapp.com/)

##アプリ作成の理由  
アプリを作ろうと思ったのは以下の理由からです。  

- プログラミングはアウトプットした方が上達が早い
TwitterやQiitaなどで多くの方がアウトプットすることが上達の近道だと発信しているため。

- Progateで学んだ知識を使ってみたい
学んだ知識を活かして、コメント投稿型アプリを作ってみたいと思ったため。　

- アプリ作成の一連の流れを経験したかった
実際の開発ではProgateのようにただコードを書くだけではなく、アプリを作るための環境構築や作ったアプリを公開するためのデプロイが必要だと思ったため。

##開発の流れ  
開発は主に以下の流れで行いました。

1. 成果物決め
1. 環境構築
2. コーディング 
1. デプロイ  

それぞれの工程でやったこと、詰まったところを時系列にして書いていきます。
詰まった時に参考にした記事はページの最後にリンク一覧でまとめています。

###1.成果物決め

はじめに何を作るか考え、Progateで作ったアプリに近いものを目標にしました。
参考になるアプリを探していたところ、[この方](https://qiita.com/Ryokky/items/833cb3cf916ec0fd1e19)のTwitterのクローンアプリが難易度的にもちょうど良さそうだったので、こちらを参考にして作りました。

###2.環境構築

続いて自分のPCで開発を行うためにRailsの環境構築を行いました。
構築の手順はProgate(2019年9月時点)の手順を参考にして進めました。rbenv(Rubyのバージョン管理ツール)も必要だったので併せてインストールしています。

- [Rubyの環境構築手順](https://prog-8.com/docs/ruby-env)
- [Railsの環境構築手順](https://prog-8.com/docs/rails-env)  

**ローカルでサーバーが立てられない**
上記手順で環境構築するまではよかったのですが、試しにローカルでサーバーを立ててみるとうまくいかず、原因はwebpackとyarnが導入されていないとのこと。

webpackとyarnをインストールして再度コマンドを実行したら、問題なくブラウザで表示できました。
[参考にした記事1](#参考にした記事)

###３.コーディング

コーディングではProgateで学んだ知識の前半(学習コースのI〜Ⅵ)を活かして、
以下の順番で実装を進めました。
ただマネするだけではつまらないと思い、コメントが一定数投稿されたらコメント一覧ページを複数に分割するページネーション機能も実装しました。またスタイルはBootstrapを利用しました。

- 画面表示とルーティング
- 新規投稿
- 投稿の表示
- 投稿の編集と削除
- バリデーション  
- メッセージの表示
- ページネーション

**ファイルを編集しても変更が更新されない**
viewsフォルダにある.erbファイルを編集・保存し、ブラウザを更新しても変更が反映されませんでした。
どうやらconfig/development.rbでファイルの変更が検知されない設定になっていることが原因とのこと。
以下ファイル変更を検知する設定に変更し、ブラウザで変更が反映されました。

```ruby:development.rb
config.file_watcher = ActiveSupport::FileUpdateChecker
```
[参考にした記事2](#参考にした記事)

**バリデーションのエラーメッセージが英語で表示される**
空白のコメントは投稿できないようにバリデーションを設定しましたが、「Content can't be blank」と英語で表示されてしまいます。※「Content」の部分はDBのカラム名です
日本語で表示するためのgemをインストールしconfig/application.rbの設定を変更することで、日本語のエラーメッセージが表示出来ました。

```:Gemfile
gem 'rails-i18n'
```
```ruby:config/application.rb
config.i18n.default_locale = :ja
```
[参考にした記事3](#参考にした記事)

**ページネーションの実装方法が分からない**
調べてみたらGemのインストール後にcontrollersとviewsのファイルを少し編集するだけで簡単に実装出来ました。あまりにも簡単だったので、別の機能を追加してもよかったかもしれません...

```:Gemfile
gem 'kaminari', '~> 0.17.0'
```
```ruby:app/controllers/test_controllers.rb
class TestController < ApplicationController

  PER = 10 #1ページごとのコメント数

  def index
    @posts = Post.page(params[:page]).per(PER)
  end
```
```ruby:app/views/test/index.html.erb
#コメント一覧ページの最後に追加
<%= paginate @posts %>
```
[参考にした記事4](#参考にした記事)

###4.デプロイ
いよいよアプリを公開するためのデプロイ作業です。デプロイまでの作業は主に以下の流れでした。

- デプロイするために各種ファイルの設定変更
- Herokuのユーザー登録
- Heroku-cliのインストール
- 作成したアプリをHerokuへpush
- Heroku環境でマイグレーション

[参考にした記事5](#参考にした記事)


**ローカルからHerokuへpush出来ない**
Herokuへpushする際にPermission denidedと表示され、pushが出来ませんでした。

```
$ git push heroku master
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rightsand the repository exists.
```

SSH通信(暗号化通信)するための公開鍵が無いとのことなので、以下コマンドで公開鍵を登録するとpush出来ました。(情報処理試験を勉強してたお陰で何とか推測出来ました)


```
$ heroku keys:add
```
[参考にした記事6](#参考にした記事)

push後にマイグレーションし、問題なく稼動していることを確認して終了しました！

##所感
- 自作するときに大切なのは検索力 
今回アプリを作成してみて検索力が１番重要だと感じました。
詰まった時は必ず誰かも同じような状況になって試行錯誤しており、その時の解決策を残してくれていました。
分からなくても諦めずに関連するキーワードで検索し続けることが、自作するときには必要な力だと思いました。

- Qiitaへの投稿はマメにする
エラーになった際は数行でもいいのですぐにQiitaに投稿しようと思いました。
エラー時の状況や解決の流れなど、しばらくすると忘れてしまうので、覚えているうちに投稿しようと思います。
特にエラーメッセージのログは何のエラーなのか特定しやすくするために必ず記録します。

- アウトプットは楽しい
0からアプリを作るのは大変な分、終わった時は教材では味うことが出来ない気持ち良さがありました。
エラーになって何時間も悩んでいるのは本当に辛いですが、想定通りの動きをしてくれた時は悩んでいた時間の苦労を感じさせないぐらい楽しかったです。
小さなアプリでも、誰かの真似でもいいので、この記事でアウトプットしてくれる人が増えてくれれば嬉しいです。

###参考にした記事

1. [Rails6 Webpackerでエラーが出た](https://qiita.com/libertyu/items/1eb74adc817ab8971100)
1. [【Ruby on Rails】ソースコードの変更が反映されないときの対処法](http://issyu39.com/programming/notreflected/)
1. [Railsのバリデーションエラーのメッセージの日本語化](https://qiita.com/Ushinji/items/242bfba84df7a5a67d5b)
2. [【Ruby on Rails】gem(Kaminari)でページネーション機能を追加してBootstrapを適用する。](https://qiita.com/residenti/items/1ae1e5ceb59c0729c0b9)
3. [【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39)
4. [git push heroku master permission denied
](https://stackoverflow.com/questions/14342553/git-push-heroku-master-permission-denied)