MySQL
RubyOnRails

Vagrant + Ruby on Rails + MySQL環境構築

More than 1 year has passed since last update.

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

今回の目的

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

環境

○ホスト:

・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の環境を作っていきます。

Macでやること

ターミナルでvagrantを使いローカルサーバを立てます。

Vagrant

注)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で行うことは終了です。

CentOSでやること



gitインストール

$ sudo yum install -y git

諸々パッケージインストール

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

rbenvインストール

$ cd ~

$ mkdir .rbenv
$ git clone git://github.com/sstephenson/rbenv.git .rbenv

パスを通す

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l

バージョンを確認してみる

$ rbenv --version

rbenv 1.0.0-31-gd0779fc

となればOK。

Rubyインストール

$ 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は完了まで時間かかることがあります。

注2)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

で解決しました。

バージョンを確認してみる

$ ruby -v

ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

Railsインストール

$ gem install rails -v 5.0.0 --no-ri --no-rdoc

注)オプション --no-ri --no-rdoc をつけてインストール量を削ることで若干インストールが速くなります。

MySQLインストール

まず、すでに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のインストールが終了しました。

MySQLサーバ起動

$ sudo service mysqld start

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

$ sudo chkconfig mysqld on

chkconfigまとめ

http://qiita.com/shell/items/30031862d91cedf9ceef

MySQLのrootユーザのパスワード

これで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文字以上の大小英数記号を組み合わせ」でなければいけない、ということです。

Railsプロジェクト作成

通常は

$ 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してみます。

今度はうまくいきました。

いろいろ調整



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)

Gemfile修正

Gemfileを開き、

# gem 'therubyracer', platforms: :ruby

⇑ この行(17行目あたり)のコメントを外す

そして

$ bundle install

を実行する。

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

サーバ起動

$ 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を編集してみました。

今度は。。

スクリーンショット 2016-09-13 23.33.34.png

接続できました!!!

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

コントローラ作成

トップ画面を作りたいので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

ユーザテーブル作成

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からのデータ出力を行います。

DBから出力

ダミーデータ作成

モデルを作成すると、test/fixtures配下にダミーデータ作成用のファイルが作成されますのでそれを使います。

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

one:

uuid: AAAA
name: nameA

two:
uuid: BBBB
name: nameB

それでは読み込んでいきましょう。

データ出力

$ 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からデータを取得&出力するまでのまとめでした。最後までお読みいただきありがとうございました。