[Ruby on Rails] Vagrant上で動作するまでの環境構築

# はじめに
思い立って `Ruby on Rails` を勉強しようと思ったので。
環境構築をするまでの手順を忘れないうちにまとめておきます。
何番煎じか分からないけど…。

# 環境構築
`vagrant` 上に環境を作りました。
本当は `Dockerfile` 使いたかった…。

## VM起動まで
基本的には [**こちら**](https://qiita.com/uu64/items/eb5f64e45a0e39f2dafb#vagrant%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97) の記事をベースに構築しました。

```bash:console
# プロジェクトディレクトリの作成
mkdir rails_tutorial
cd rails_tutorial
# マウント用のディレクトリを作成
mkdir code
# Vagrantfile生成
vagrant init
```

```text:rails_tutorial/Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  # centos7を使用
  config.vm.box = "centos/7"
  # ホストマシンの3000番ポートをゲストOSの2000番ポートへフォワード
  config.vm.network "forwarded_port", guest: 2000, host: 3000
  config.vm.provider "virtualbox" do |vb|
   # VirtualBoxのGUI上の名前を設定
   vb.name = "centos7"
   # メモリは2048MBに設定
   vb.memory = "2048"
   # フォルダーマウント
   config.vm.synced_folder "./code", "/vagrant/code", owner: "vagrant", group: "vagrant"
  end
end
```

おそらくこのままだと `vagrant up` 時にエラーが出る可能性が。
次のコマンドを叩いて回避します。

```bash:console
vagrant plugin install vagrant-vbguest
vagrant up
vagrant ssh
```

これでVM上のソースコードを `rails_tutorial/code` 内に置くことで、ローカル環境で開発できるようになります。

## Ruby環境準備

### 必要パッケージのインストール

```bash:vm_console
sudo yum -y update
sudo yum -y install git-all openssl-devel readline-devel sqlite gcc gcc-c++ vim
```

### rbenvからRubyのインストール

`PHP` で言うところの `phpenv` 的なパッケージだそう。
プロジェクトによって `Ruby` のバージョンを変えたい場合に使えそうです。

```bash:vm_console
# rbenvのクローン
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv ; git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# パスを通す
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
echo 'gem: --no-ri --no-rdoc' > ~/.gemrc

# シェルの再起動
exec $SHELL

# インストール可能なバージョンの取得
rbenv install --list

# バージョン2.5.1をインストール
rbenv install 2.5.1
rbenv global 2.5.1

#bundlerのインストール
gem install bundler
```

ここで出てきた `bundler` が `PHP` で言うところの `composer` みたいなものらしいです。ね。

### データベースの準備
[**過去の私の記事**](https://qiita.com/tosite0345/items/b9ec1594f359f03b0403#mysql%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%BA%96%E5%82%99) をベースに今回は `MySQL` を入れていきます。
別に `PostgreSQL` でもよかったんですけどね。

**やること**

* MySQLのインストール
* ユーザー作成と権限付与（今回は `rails_user` / `Ruby0nR@ils` を準備）

### Railsプロジェクト生成

```bash:vm_console
cd /vagrant/code
bundle init
vim Gemfile
```

```diff:Gemfile
# frozen_string_literal: true
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
- # gem "rails"
+ gem "rails", "5.2.1"
```

```bash:vm_console
# タスクランナーで使われてるっぽいのでnodejsを入れておく
sudo rpm -Uvh https://rpm.nodesource.com/pub_4.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm
sudo yum install -y nodejs

# 後述のエラーを回避するためにパッケージを入れておく
sudo yum install -y mysql-devel

# Railsのライブラリをインストール
bundle install

# composer create-project laravel/laravel コマンドに相当するっぽい
bundle exec rails new . --database=mysql --skip-spring
#
```

**後述のエラー**（ `bundle exec` 時に発生）
[**bundle install で mysql2 のgemがインストールできない**](http://sweep3092.hatenablog.com/entry/2014/12/11/163108) を参考にさせていただきました。

> An error occurred while installing mysql2 (0.5.2), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'`
succeeds before bundling.

### database.ymlファイルを修正

```diff:/vagrant/code/config/database.yml
...
development:
-  <<: *default
+  adapter: mysql2
+  encoding: utf8
+  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+  username: rails_user
+  password: Ruby0nR@ils
-  database: code_development
+  database: rails_db
+  host: localhost
...
```

```text:コピー用
development:
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: rails_user
  password: Ruby0nR@ils
  database: rails_db
  host: localhost
```

### データベース生成・Webサーバー起動

```bash:vm_console
# データベース生成
bin/rake db:create
# Webサーバー起動
bin/rails server -b 0.0.0.0 -p 2000
```

ローカル環境から `http://localhost:3000` に接続したら次の画面になっているかと思います。
<img width="688" alt="スクリーンショット 2018-10-06 1.17.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/165355/fdac3cd5-f331-25b3-da63-9831fbd5d23e.png">

# 終わりに
なんとか開発環境が構築できました。
やってみて思うのが、 `Laravel` はどれだけ開発環境充実してるねんっていうことですね。
開発環境にしろ何にしろ、とにかく手間がかからないというか…導入までのことを考えても `Laravel` が人気な理由を再認識しました。
`db:create` でデータベース設定ファイルに記述されているデータベースを自動生成してくれるのはいいなと思った。
とにかく、これでいろいろやれるようになったので何かしらのサービスを一つは組み上げたいものです。
やっぱToDoアプリかなー。