はじめに
Rails APIに関して、チュートリアルがあまり見当たらなかったため作成しました。
なお、筆者自身もRails API触り始めて半年程度なので、誤っている点などあればご指摘ください。
Rails APIモードを使い、掲示板APIを構築してみようと思います。
なお、フロントエンドは本チュートリアルに含みません。
API完成後、ご自由なものを選択してください。
目次
全18回の連載です
- [Rails 6で認証認可入り掲示板APIを構築する #1 環境構築
- Rails 6で認証認可入り掲示板APIを構築する #2 gitとrubocop導入
- Rails 6で認証認可入り掲示板APIを構築する #3 RSpec, FactoryBot導入しpostモデルを作る
- Rails 6で認証認可入り掲示板APIを構築する #4 postのバリデーション、テスト実装
- Rails 6で認証認可入り掲示板APIを構築する #5 controller, routes実装
- Rails 6で認証認可入り掲示板APIを構築する #6 show, create実装
- Rails 6で認証認可入り掲示板APIを構築する #7 update, destroy実装
- Rails 6で認証認可入り掲示板APIを構築する #8 seed実装
- Rails 6で認証認可入り掲示板APIを構築する #9 serializer導入
- Rails 6で認証認可入り掲示板APIを構築する #10 devise_token_auth導入
- Rails 6で認証認可入り掲示板APIを構築する #11 userモデルのテストとバリデーション追加
- Rails 6で認証認可入り掲示板APIを構築する #12 userとpostの関連付け
- Rails 6で認証認可入り掲示板APIを構築する #13 認証ヘッダの付与
- Rails 6で認証認可入り掲示板APIを構築する #14 seed実行時間の表示
- Rails 6で認証認可入り掲示板APIを構築する #15 pundit導入
- Rails 6で認証認可入り掲示板APIを構築する #16 policyの設定
- Rails 6で認証認可入り掲示板APIを構築する #17 管理者権限の追加
- Rails 6で認証認可入り掲示板APIを構築する #18・終 user controllerの実装
対象読者
- Ruby on Railsチュートリアルを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
認証:devise_token_auth
認可:pundit
ダミーデータ:Faker
静的コード解析:rubocop
テスト:RSpec, FactoryBot
Cloud9環境の構築
まずはAWSアカウントをお持ちでない場合、アカウントを取得しましょう。
本記事ではアカウントを所持していること前提として解説をします。
分かりやすい名前と説明を入れ作成します。
2ページ目は基本的に全てデフォルトで問題ないでしょう。
構築に数分かかるので放置します。
完了したらこんなIDE画面が表示されます。
Rubyのバージョンアップ
最初からRubyもRailsも入っていますが、バージョンが古いですね。
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
$ rails -v
Rails 5.0.0
記事執筆当時の安定バージョンは2.7.1なので上げましょう。
$ 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使用)
Railsのバージョンを上げる
こちらも、記事執筆当時最新が6.0.3に対し、インストールされているのが5.0.0とだいぶ古いので上げましょう。
$ gem install rails
...
$ rails -v
Rails 6.0.3.2
簡単ですね。
postgreSQLを入れる
なぜpostgresをこのタイミングで入れるか?
Railsのデフォルト開発DBはSQLiteですが、Amazon LinuxのCloud9環境だとSQLiteのバージョンが低くアプリケーションが作れません。バージョン上げがなかなかしんどいので、今回はPostgreSQLを使います。
また、SQLiteはその名の通り機能的にもliteなので、他のRDBMSに比べてできないことも多く、無駄に詰まることがあるので、それを回避するのも要因の一つです。
まずインストールします。
$ sudo yum install postgresql95-devel postgresql95-server postgresql95-contrib
$ psql --version
psql (PostgreSQL) 9.5.15
次に初期化と起動、ユーザー作成。Permission deniedは無視でOKです。
$ 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)で動かしてみる
APIモードでrails newする
$ rails new bbs -d postgresql --api
--apiと付けることでRails APIモードとなります。
APIに不要なファイルが生成されない状態で作られます。
Railsのテストサーバを立ち上げる
New Terminalから新しいターミナルを立ち上げます。
ローカル等ではrails s
だけでテストサーバが立ち上がるのですが、Cloud9はオプションが必要です。
$ 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で確認してみましょう。
テストサーバを立ち上げたターミナルウィンドウは、止めずに放置してください。
$ cd bbs/
$ curl localhost:8080
{"status":500,"error":"Internal Server Error","exception":"#\u003cActiveRecord::NoDatabaseError: FATAL: database \"bbs_development\" does not exist
どうやらDBが無くて怒られてます。
railsでDBの初期化をしましょう。
$ 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
して閉じます。
ホストを許可する
Rails6から、ホストを許可しないとエラーでページが表示されません。
Cloud9で実行しているので、AWSのhostsを追加します。
保存したらテストサーバを一度Ctrl+Cで止め、再起動してください。そうしないとconfigが反映されません。
...
module Bbs
class Application < Rails::Application
...
+ config.hosts << '.amazonaws.com'
...
end
end
Welcome画面を表示する
画面上部からPreview Running Applicationを押すと、小さくアプリケーションウィンドウが立ち上がります。
ですがこの小さいウィンドウでは正常に実行されないため、Pop Out Into New Windowを押して別ウィンドウを立ち上げます。
するとついに、正常にWelcome画面が表示されます。