インターネットのスケッチ

Done is better than perfect.

初めてのプライベート開発 その2

ローカル開発環境を作っていきます。

基本的には以前自分であげたこちらの記事に沿って、Dockerで立てます。

khanamoto.hatenablog.com

技術スタック

現時点での最新バージョンを使います。

MySQL 8.0は正式版が数日前にリリースされたばかりですが、出たばかりの技術に触れることに慣れるいい機会なので8.0を使ってみようと思います(開発中にどうしても行き詰まった場合や深刻な脆弱性が出てきたら5.7にするかもしれません…)。

Amazon RDSで使えるバージョンに合わせてMySQL 5.7にします。

それと本番ではサーバーにnginxを使うつもりですが、開発環境ではしばらくpumaを使っていく予定です。

Railsアプリ&DB新規作成

以下のファイルを作って、

.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── docker-compose.yml
└── .env

$ docker-compose run web rails new . --force --database=mysql
$ docker-compose build
$ docker-compose run web rake db:create
を順に実行します。ファイルの中身など詳細は前掲の記事参照。

注意点はGemfileでrailsのバージョンを5.2にすること。

source 'https://rubygems.org'
gem 'rails', '~> 5.2'

もし古いバージョンで作成してバージョンアップしたいときは、コンテナとイメージを両方削除してからもう一度rails newしてください。
ちなみに-sオプションで既存ファイルをスキップするとGemfileもスキップされるので注意。

テーブル作成

新規にテーブルを作成するので、rails generate modelコマンドでモデルとマイグレーションファイルをあわせて生成します。すでに存在するテーブルの変更の場合はmigrationコマンドを使います。

モデルクラス新規作成

docker-compose run web rails generate model tag tag_name:string
docker-compose run web rails generate model film user:references title:string staff:string comment:text favorite_scene:text watch_day:date cinema:string film_image:binary
docker-compose run web rails generate model film_tag film:references tag:references
docker-compose run web rails generate model user user_name:string profile_name:string email:string password:string profile:text user_image:binary
docker-compose run web rails generate model comment film:references user:references body:text
docker-compose run web rails generate model like film:references user:references
docker-compose run web rails generate model contact user:references body:text
docker-compose run web rails generate model follow user:references follow:references

マイグレーションファイル編集

NOT NULLやユニークなど列制約をつけます。
ユニーク制約はエラーが出たときの発生箇所を特定しやすくするために、アプリケーション側(モデル)とDB側(マイグレーション)の両方で設定しました。

マイグレーション実行

マイグレーションファイルを実行し、テーブルを作成します。

$ docker-compose run web rails db:migrate

アソシエーション(関連付け)設定

あとから開発で変更するかもしれませんが、テーブル設計にもとづいてアソシエーションをモデルに書いておきます。

フロントエンド整備

SlimとBootstrapをgemに追加します。jquery-railsはbootstrapのために必要です。

gem 'slim-rails'
gem 'bootstrap'
gem 'jquery-rails'

そしてerbファイルはslimファイルに変更し、中身もslim記法に書き換えます。

さらにapp/assets/javascripts/application.jsに以下を追加

//= require jquery3
//= require popper
//= require bootstrap-sprockets

application.cssをapplication.scssに変更し、以下を追加。

@import "bootstrap"

まとめ

開発環境の準備ができたのでここから開発に入っていきます。
まずは会員登録とログインから実装していきます。ここがしっかりできればあとはフォロー以外はそんなに難しくないかなと思います。

フォローはたぶん一番の山場になりそう。

余談

MySQL 8.0を使った場合のmysql 認証エラー。一応将来のためのログとしてここに残しておきます。

$ docker-compose run web rake db:create
Starting films-app_db_1 ... done
#<Mysql2::Error: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>"root", "host"=>"db", "database"=>"films_development"}, {:charset=>"utf8"}
(If you set the charset manually, make sure you have a matching collation)
Created database 'films_development'
#<Mysql2::Error: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>"root", "host"=>"db", "database"=>"films_test"}, {:charset=>"utf8"}
(If you set the charset manually, make sure you have a matching collation)
Created database 'films_test'

参考

MySQL 8.0正式版がリリース。性能が最大で2倍、JSONデータや地理情報などサポート。ロールによるユーザー権限の管理も可能に - Publickey

Docker で MySQL 8.0.4 を使う - Qiita

MySQL :: MySQL 8.0 Reference Manual :: 6.5.1.3 Caching SHA-2 Pluggable Authentication

Ruby on Rails 5.2正式版発表。Active Storageによるクラウドストレージ対応、Redisでのキャッシュ対応など - Publickey

マイグレーションファイル編集

Ruby - RailsでUserIDに一意制約を設けたい(121938)|teratail

Rails 複数のカラムに 一意制約 (ユニーク)を設ける - yamarkz's blog

Active Record バリデーション | Rails ガイド