Vagrant + Ruby on Rails + MySQL環境構築

Rubyを勉強したいということでまず今回は環境構築メモをまとめることにしました。

<h1>今回の目的</h1>
Ruby on Railsの環境を構築し、ホストのブラウザからアクセスできるようにする。また、その際DBから取得したデータを出力するようにする。

<h1>環境</h1>
○ホスト：
・MacOSX 10.11.5
・Vagrant 1.5.1
・VirtualBox 4.3.40
○ゲスト：
・CentOS6.5
・Ruby 2.3.1
・Rails 5.0.0
・MySQL 5.7

Vagrantで構築したサーバにRuby on Railsの環境を作っていきます。

<h1>Macでやること</h1>
ターミナルでvagrantを使いローカルサーバを立てます。

<h2>Vagrant</h2>
注）centOS6.5のboxをcentos6.5という名前で保持しています。

```
$ vagrant init centos6.5
```
生成されたVagrantfileを少し修正してあげます。

```
config.vm.network "forwarded_port", guest: 80, host: 8080
↓
config.vm.network "forwarded_port", guest: 3000, host: 3000

# config.vm.network "private_network", ip: "192.168.33.10"
↓ コメント外す
config.vm.network "private_network", ip: "192.168.33.10"
```

Vagrantfileの修正が終わったら、

```
$ vagrant up
$ vagrant ssh
```
これでMacで行うことは終了です。
<h1>CentOSでやること</h1>
<h2>gitインストール</h2>

```
$ sudo yum install -y git
```
<h2>諸々パッケージインストール</h2>

```
$ sudo yum install -y gcc make glibc-headers openssl-devel readline libyaml-devel readline-devel sqlite-devel
```

<h2>rbenvインストール</h2>

```
$ cd ~
$ mkdir .rbenv
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
```
<h2>パスを通す</h2>
```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
```

<h3>バージョンを確認してみる</h3>

```
$ rbenv --version
rbenv 1.0.0-31-gd0779fc
```
となればOK。
<h2>Rubyインストール</h2>

```
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install 2.3.1
$ rbenv global 2.3.1
```
注1）rbenv install 2.3.1は完了まで時間かかることがあります。

注２）rbenv installが失敗する

```
[root@localhost ~]# rbenv install 2.3.1
Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
error: failed to download ruby-2.3.1.tar.bz2

BUILD FAILED (CentOS release 6.7 (Final) using ruby-build 20170914-2-ge40cd1f)
```

となる場合がある。私は

CentOS6.xのlibcurlが古くてcurl: (35) SSL connect errorが発生する件
https://qiita.com/shunsuke_takahashi/items/a1c3655584530c76fbe0

で解決しました。


<h3>バージョンを確認してみる</h3>

```
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
```
<h2>Railsインストール</h2>

```
$ gem install rails -v 5.0.0 --no-ri --no-rdoc
```
注）オプション　--no-ri --no-rdoc　をつけてインストール量を削ることで若干インストールが速くなります。

<h2>MySQLインストール</h2>
まず、すでにOSにMySQLが入ってないか確認します。5.7ではないものがあったら削除します。

```
$ rpm -qa | grep mysql
mysql-libs-5.1.66-2.el6_3.x86_64
```
すでに5.1があったので削除します。

```
$ sudo yum remove mysql*
```
改めて5.7をインストールします。

```
$ sudo rpm --import http://dev.mysql.com/doc/refman/5.7/en/checking-gpg-signature.html
$ sudo rpm -ihv http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
$ yum --disablerepo=\* --enablerepo='mysql57-community*' list available
$ sudo yum --enablerepo='mysql57-community*' install -y mysql-community-server
```
これでMySQLのインストールが終了しました。
<h3>MySQLサーバ起動</h3>

```
$ sudo service mysqld start
```
これでMySQLの起動は完了!なのですが、chkconfigに登録をしておくと後で楽になります。

```
$ sudo chkconfig mysqld on
```

chkconfigまとめ
http://qiita.com/shell/items/30031862d91cedf9ceef

<h3>MySQLのrootユーザのパスワード</h3>
これでMySQLの起動も終わりました。しかし、rootユーザで入ろうと思ってもパスワードがわかりません。。。
ログの中にあるパスワードを探ってみようと思います。

```
$ sudo cat /var/log/mysqld.log | grep 'password is generated'
```
これで初期パスワードが表示されます。このパスワードでMySQLに入り、rootユーザのパスワードを任意のものに変更しておきましょう。

```
$ mysql -u root -p
Enter password: パスワード

mysql >ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
```
ここで注意なのが、新しいパスワードは「8文字以上の大小英数記号を組み合わせ」でなければいけない、ということです。

<h2>Railsプロジェクト作成</h2>
通常は

```
$ rails new プロジェクト名
```
でプロジェクトが作成されますが、今回はMySQLを使いたいので

```
$ rails new プロジェクト名 -d mysql
```
とします。ここではプロジェクト名をbbsとします。

```
$ rails new bbs -d mysql
```
・・・・エラーが出てしまいました！！！

```
checking for mysql_query() in -lmysqlclient... no
-----
mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or
'yum install mysql-devel', and try again.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

エラー文の中にある

```
$ yum install mysql-devel
```
を実行して、再度rails newしてみます。
今度はうまくいきました。
<h2>いろいろ調整</h2>
config/database.ymlを開いてみます。

```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: ここにパスワード入れる
  socket: /var/lib/mysql/mysql.sock

development:
  <<: *default
  database: bbs_development
```
データベースのrootユーザを使ってはいるみたいな設定なのでrootユーザのパスワードを書き込んでやります。そして、bbs_developmentというデータベースを読み込みに行きそうな勢いなので、作成しておきます。

```
$ mysql -u root -p
Enter Password:
 
mysql> create database bbs_development;
Query OK, 1 row affected (0.11 sec)
```

<h3>Gemfile修正</h3>
Gemfileを開き、

```
# gem 'therubyracer', platforms: :ruby
⇑ この行(17行目あたり)のコメントを外す
```
そして

```
$ bundle install
```
を実行する。

これでプロジェクトの準備はOK!サーバを起動してみましょう。
<h2>サーバ起動</h2>

```
$ rails s -b 0.0.0.0
```

そしてブラウザからアクセスしてみます。Vagrantfileに192.168.33.10というので設定しているので、192.168.33.10:3000でアクセスを試みます。

・・・・ずっとクルクルしてアクセスできない。。。

ログを見ると

```
Started GET "/" for 192.168.33.1 at 2016-09-13 15:49:07 +0000
Cannot render console from 192.168.33.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
```

となっていたので
Cannot render console from 10.0.2.2!と言われました
http://qiita.com/pugiemonn/items/f7956ba61012ca9fc16c
を参考にconfig/application.rbを編集してみました。
今度は。。

<img width="1245" alt="スクリーンショット 2016-09-13 23.33.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/58014/6c711321-473d-bc1d-367a-da6472898e1a.png">

接続できました！！！
さて、次はページを作るためにコントローラを作成していきます。

<h3>コントローラ作成</h3>
トップ画面を作りたいのでtopというコントローラを作成する。

```
$ rails g controller top index

Running via Spring preloader in process 30904
      create  app/controllers/top_controller.rb
       route  get 'top/index'
      invoke  erb
      create    app/views/top
      create    app/views/top/index.html.erb
      invoke  test_unit
      create    test/controllers/top_controller_test.rb
      invoke  helper
      create    app/helpers/top_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/top.coffee
      invoke    scss
      create      app/assets/stylesheets/top.scss
```
いろいろ自動生成してくれる。app/controllers/top_controller.rbを見てみましょう。

```
$ vi app/controllers/top_controller.rb

class TopController < ApplicationController
  def index
  end
end
```

<h3>ユーザテーブル作成</h3>
MySQLにユーザデータを格納するテーブルを作成してみます。
MySQLに直接入ってもできますが、railsのプロジェクトで使うものなので連携しやすいようにrailsコマンドとrakeコマンドで作成します。

```
$ rails g model User uuid:string:unique name:string
Running via Spring preloader in process 4055
      invoke  active_record
      create    db/migrate/20160913135635_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
```
上のrails g model User..... のコマンドは以下の意味を持つ
・Usersというテーブルを作成する
・そのテーブルはuuid(uniqueなstring形式), name(string形式)のカラムを持っている。
・ただし、他にデフォルトで管理IDと作成日時、更新日時のカラムを生成する。

上は定義書を作成しただけに過ぎないのでDBに反映してあげる。

```
$ bin/rake db:migrate
Running via Spring preloader in process 4089
== 20160913135635 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0157s
== 20160913135635 CreateUsers: migrated (0.0157s) =============================
```

これでテーブル完成！！

最後に、今回の目的であるDBからのデータ出力を行います。

<h2>DBから出力</h2>
<h3>ダミーデータ作成</h3>
モデルを作成すると、test/fixtures配下にダミーデータ作成用のファイルが作成されますのでそれを使います。

中身を下記のように編集：

```
one:
  uuid: AAAA
  name: nameA

two:
  uuid: BBBB
  name: nameB
```
それでは読み込んでいきましょう。

<h2>データ出力</h2>

```
$ bin/rake db:fixtures:load FIXTURES=users
```
これでOKです。そしてtop_controller.rbを下記のように編集します。

```
class TopController < ApplicationController
  def index
        @user = User.all
        @user.each{|u|
                logger.debug('=========> ' + u.id.to_s + ', ' + u.name)
        }
  end
end
```

usersテーブルから全てのデータを取り出して、ループで回し、各データのidとnameカラムを出力するというものです。

実行(ブラウザでアクセス)してみましょう。サーバログに上記の出力がされていれば成功です。

```
  ActiveRecord::SchemaMigration Load (0.4ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
Processing by TopController#index as HTML
  User Load (0.4ms)  SELECT `users`.* FROM `users`
=========> 298486374, nameB
=========> 980190962, nameA
  Rendering top/index.html.erb within layouts/application
  Rendered top/index.html.erb within layouts/application (1.0ms)
Completed 200 OK in 660ms (Views: 634.2ms | ActiveRecord: 2.5ms)
```

出力されました！

以上、rails環境を構築してDBからデータを取得＆出力するまでのまとめでした。最後までお読みいただきありがとうございました。