Rails 6で認証認可入り掲示板APIを構築する #1 環境構築

# はじめに

Rails APIに関して、チュートリアルがあまり見当たらなかったため作成しました。
なお、筆者自身もRails API触り始めて半年程度なので、誤っている点などあればご指摘ください。

Rails APIモードを使い、掲示板APIを構築してみようと思います。
なお、フロントエンドは本チュートリアルに含みません。
API完成後、ご自由なものを選択してください。

# 目次

全18回の連載です

* **[Rails 6で認証認可入り掲示板APIを構築する #1 環境構築**
* [Rails 6で認証認可入り掲示板APIを構築する #2 gitとrubocop導入](https://qiita.com/rf_p/items/5ef018bec4ed2f16fc0e)
* [Rails 6で認証認可入り掲示板APIを構築する #3 RSpec, FactoryBot導入しpostモデルを作る](https://qiita.com/rf_p/items/9b7cc0b3a76d6141b103)
* [Rails 6で認証認可入り掲示板APIを構築する #4 postのバリデーション、テスト実装](https://qiita.com/rf_p/items/0b2ccd908cac4bb6ecc6)
* [Rails 6で認証認可入り掲示板APIを構築する #5 controller, routes実装](https://qiita.com/rf_p/items/2b40f08e0509fb8ff56b)
* [Rails 6で認証認可入り掲示板APIを構築する #6 show, create実装](https://qiita.com/rf_p/items/11c1d310f3b67c7f4881)
* [Rails 6で認証認可入り掲示板APIを構築する #7 update, destroy実装](https://qiita.com/rf_p/items/da70d93e821a44cea702)
* [Rails 6で認証認可入り掲示板APIを構築する #8 seed実装](https://qiita.com/rf_p/items/05e44aa24f10b683fa0e)
* [Rails 6で認証認可入り掲示板APIを構築する #9 serializer導入](https://qiita.com/rf_p/items/be2c97c85253f4a1a914)
* [Rails 6で認証認可入り掲示板APIを構築する #10 devise_token_auth導入](https://qiita.com/rf_p/items/43f1f12c473e1b02e766)
* [Rails 6で認証認可入り掲示板APIを構築する #11 userモデルのテストとバリデーション追加](https://qiita.com/rf_p/items/59b83f2f799d5a0c537c)
* [Rails 6で認証認可入り掲示板APIを構築する #12 userとpostの関連付け](https://qiita.com/rf_p/items/bcdcbb7c6cbd725b5b94)
* [Rails 6で認証認可入り掲示板APIを構築する #13 認証ヘッダの付与](https://qiita.com/rf_p/items/ba0348fc2271cbb8e79f)
* [Rails 6で認証認可入り掲示板APIを構築する #14 seed実行時間の表示](https://qiita.com/rf_p/items/e4e840884e925c0cc053)
* [Rails 6で認証認可入り掲示板APIを構築する #15 pundit導入](https://qiita.com/rf_p/items/6ab38a354c8f31b164db)
* [Rails 6で認証認可入り掲示板APIを構築する #16 policyの設定](https://qiita.com/rf_p/items/041e86fef26fb38fed5b)
* [Rails 6で認証認可入り掲示板APIを構築する #17 管理者権限の追加](https://qiita.com/rf_p/items/bdaeab765d55ef924d02)
* [Rails 6で認証認可入り掲示板APIを構築する #18･終 user controllerの実装](https://qiita.com/rf_p/items/3ef3bce9ee81b6de440f)

# 対象読者

* [Ruby on Railsチュートリアル](https://railstutorial.jp/)を1周し、Railsアプリケーションの実装方法や用語がなんとなく分かっている方
* モノリシックなRailsではなく、RailsのAPIサーバを構築したい方

RailsのCRUD操作に関する最低限の知識はないと、追いつくのは難しいかもしれません。

# 最終的な環境・Gem

AWS Cloud9
PostgreSQL 9.5.15
Ruby 2.7.1
Ruby on Rails 6.0.3.2

Gem
シリアライザ：[active_model_serializers](https://github.com/rails-api/active_model_serializers)
認証：[devise_token_auth](https://github.com/lynndylanhurley/devise_token_auth)
認可：[pundit](https://github.com/varvet/pundit)
ダミーデータ：[Faker](https://github.com/faker-ruby/faker)
静的コード解析：[rubocop](https://github.com/rubocop-hq/rubocop)
テスト：[RSpec](https://github.com/rspec/rspec-rails), [FactoryBot](https://github.com/thoughtbot/factory_bot)

# Cloud9環境の構築

まずはAWSアカウントをお持ちでない場合、アカウントを取得しましょう。
本記事ではアカウントを所持していること前提として解説をします。

AWSマネジメントコンソールでCloud9を探します。
![s1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/034978b9-3f35-aecb-82ab-a359ace53750.png)

Create environmentを押します。
![s2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/080e0c9e-d9ae-512f-c571-f3a1a9f392d6.png)

分かりやすい名前と説明を入れ作成します。
![s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/3a7e76fe-3a39-df9f-410d-a9e64cd6e314.png)
2ページ目は基本的に全てデフォルトで問題ないでしょう。

構築に数分かかるので放置します。
完了したらこんなIDE画面が表示されます。

![s4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/0a254fb4-1f92-d571-dac8-646e4cf1940b.png)

# Rubyのバージョンアップ

最初からRubyもRailsも入っていますが、バージョンが古いですね。

```powershell
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
$ rails -v
Rails 5.0.0
```

![s5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/17afa53b-01fe-2d3f-1962-183e047415a9.png)

[記事執筆当時の安定バージョンは2.7.1](https://www.ruby-lang.org/ja/downloads/)なので上げましょう。

```powershell
$ rvm install 2.7.1
...
$ rvm use 2.7.1
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
```

無事上がりました。

参考：[【AWS】Cloud9でRubyのバージョンをアップデートする方法（rvm使用）](https://qiita.com/nekotter222/items/37f260c56012d2a3557c)

# Railsのバージョンを上げる

こちらも、記事執筆当時最新が6.0.3に対し、インストールされているのが5.0.0とだいぶ古いので上げましょう。

```powershell
$ gem install rails
...
$ rails -v
Rails 6.0.3.2
```

簡単ですね。

参考：[Cloud9でRailsのバージョンを変更する](https://qiita.com/pyon_kiti_jp/items/37860333b1467f0cf573)

# postgreSQLを入れる

なぜpostgresをこのタイミングで入れるか？

Railsのデフォルト開発DBはSQLiteですが、Amazon LinuxのCloud9環境だとSQLiteのバージョンが低くアプリケーションが作れません。バージョン上げがなかなかしんどいので、今回はPostgreSQLを使います。

また、SQLiteはその名の通り機能的にもliteなので、他のRDBMSに比べてできないことも多く、無駄に詰まることがあるので、それを回避するのも要因の一つです。

まずインストールします。

```powershell
$ sudo yum install postgresql95-devel postgresql95-server postgresql95-contrib
$ psql --version
psql (PostgreSQL) 9.5.15
```

次に初期化と起動、ユーザー作成。Permission deniedは無視でOKです。

```powershell
$ sudo service postgresql95 initdb
Initializing database: sudo service postgresql95 start     [  OK  ]
$ sudo service postgresql95 start
Starting postgresql95 service:                             [  OK  ]
$ sudo -u postgres createuser -s ec2-user
could not change directory to "/home/ec2-user/environment": Permission denied
```

参考：[[Rails6]AWS Cloud9(Amazon Linux)で動かしてみる](https://yuruli.info/try-to-run-rails6-on-cloud9/)

# APIモードでrails newする

```powershell
$ rails new bbs -d postgresql --api
```

--apiと付けることでRails APIモードとなります。
APIに不要なファイルが生成されない状態で作られます。

# Railsのテストサーバを立ち上げる

New Terminalから新しいターミナルを立ち上げます。

![s6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/c0e7c1ee-ebab-7239-3d86-d9b101117890.png)

ローカル等では`rails s`だけでテストサーバが立ち上がるのですが、Cloud9はオプションが必要です。

```powershell
$ cd bbs/
$ rails s -b $IP -p $PORT
...
* Listening on tcp://127.0.0.1:8080
Use Ctrl-C to stop
```

これでサーバが立ち上がります。
なお、書いてあるとおりCtrl+Cで止めることができます。
port8080で動いていることが分かりますね。

先程のターミナルに戻り、ちゃんと立ち上がったかcurlで確認してみましょう。
テストサーバを立ち上げたターミナルウィンドウは、止めずに放置してください。

```powershell
$ cd bbs/
$ curl localhost:8080                                                                                                                  
{"status":500,"error":"Internal Server Error","exception":"#\u003cActiveRecord::NoDatabaseError: FATAL:  database \"bbs_development\" does not exist
```

どうやらDBが無くて怒られてます。
railsでDBの初期化をしましょう。

```powershell
$ rails db:create
...
Created database 'bbs_development'
Created database 'bbs_test'
$ curl localhost:8080                                                                                                                  
```

なんかhtmlっぽい大量の文字列が出てきたら、とりあえず500系エラーは起きていないので大丈夫です。

# IDEの初期設定をする

インデントはspace2にしたいので、画面右端にある歯車マークから設定画面へ。
Code Editor (Ace)を選択し、

Soft Tabsを4から2に偏向
On Save, Strip Whitespace

して閉じます。

![edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/263ea7ee-622e-ddfa-6b71-5c56c1c846cb.png)


# ホストを許可する

Rails6から、ホストを許可しないとエラーでページが表示されません。
Cloud9で実行しているので、AWSのhostsを追加します。
保存したらテストサーバを一度Ctrl+Cで止め、再起動してください。そうしないとconfigが反映されません。

```diff:config/application.rb
...
module Bbs
  class Application < Rails::Application
...

+    config.hosts << '.amazonaws.com'

...
  end
end
```

# Welcome画面を表示する

画面上部からPreview Running Applicationを押すと、小さくアプリケーションウィンドウが立ち上がります。

![s7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/be0f0469-ec3e-a182-2595-01e9170fd4e5.png)

ですがこの小さいウィンドウでは正常に実行されないため、Pop Out Into New Windowを押して別ウィンドウを立ち上げます。

![s8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/2f1724a5-0593-8832-eded-1d51eac2bea8.png)

するとついに、正常にWelcome画面が表示されます。

![welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/be4ff5bb-a6e5-496a-a957-657afb36c825.png)

# 続き

→[Rails 6で認証認可入り掲示板APIを構築する #2 gitとrubocop導入
](https://qiita.com/rf_p/items/5ef018bec4ed2f16fc0e)
【[連載目次へ](https://qiita.com/rf_p/items/a846553c11571f4177eb#%E7%9B%AE%E6%AC%A1)】