[Ruby入門 Rails5編] 01. CentOS7.3にRails5環境を構築して学習を開始する


ようやくRails編に突入！・｀ω´･)9
ここからは、書籍（最近出た山田祥寛さんの本）や、[有名なチュートリアルサイト](https://railstutorial.jp/?version=5.0) なども参考にしつつ進める。
第１回は、CentOSでのRuby環境構築、Rails5の導入、はじめてのRailsアプリケーションを動かすまでを試してみる。


### ■ 今回の参考URL
---

http://www.wings.msn.to/index.php/-/B-08/rbenv/

http://www.wings.msn.to/index.php/-/B-08/lin_rails/

http://qiita.com/kaikusakari/items/ab518cfe9cf9ed037725

https://railstutorial.jp/chapters/beginning?version=5.0#sec-bundler

https://techracho.bpsinc.jp/hachi8833/2016_12_13/30751

　
### ■ 環境構築手順
---

#### 【０】前提（OSの準備）
CentOS7.3 の環境を用意しておく。

今回は、Mac上に Docker で CentOS7.3 を用意した。
導入手順は、[Mac に Docker で CentOS7.3 をインストール](http://qiita.com/prgseek/items/fd368402b90beb83683a)  を参照。

上記の記事の Dockerfile を見てもらうと分かるが、開発まわりで必要となることが多いライブラリ群と、ツールをいくつか、併せてインストールしている。
足りないライブラリが出てきたら、随時追加インストールする想定。

★★★ 重要 ★★★
後述の手順で、Rubyの組み込みWEBサーバーである Puma を利用する。
Puma はデフォルトで3000番ポートで接続を受け付けるため、MacのブラウザからDockerのCentOSの3000番ポートへアクセスできるようにしておきたい。
そのため、上記のDocker構築手順の「docker run 〜」でコンテナを起動するときに、「-p 3000:3000」を付加して、3000番ポートをポートフォワーディングしておく。

```bash
# 実行例
docker run --privileged -it -d --name cent7test -p 3000:3000 -v /Users/miro/docker/cent72/share:/docker-host/share miro/centos7:1.0 /sbin/init

# -v はホスト側(ここではMac側)のフォルダをマウントするオプション。構築したRailsプロジェクトをMacから編集できるようにしたいのでマウントしている。
# パスや名称は適宜読み替えてください
```


　
#### 【１】ruby ユーザを作成
今回用意した Docker の CentOS 環境には root しかユーザがいなかったので、ruby という一般ユーザを作って作業する。

```bash
# useradd -g wheel -d /usr/local/ruby ruby
# passwd ruby   ← rubyユーザにパスワードを設定しておく。あとでsudoするときに必要。
# su - ruby
$
```


★★★ 以下、基本的に rubyユーザで作業する。★★★
※一部、curl による Node.js のインストールだけはsudoでエラーになったので、rootで実行した。


　
#### 【２】rbenv と ruby-build をインストール

バージョンを指定して Ruby をインストールするために「rbenv」を利用する。
また、Rubyの取得先を管理するための rbenvプラグインである「ruby-build」もインストールする。

① rbenv のインストール

```bash
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

　
② rbenvのコマンドにパスを通す

「~/.bash_profile」に記述を追加する。

vi ~/.bash_profile

```bash
export PATH="$HOME/.rbenv/bin:$PATH"
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```

source ~/.bash_profile
で即時反映。

　
③ ruby-build をインストール

```bash
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

※今後、新しいRubyをインストールしたいときは、さきに、以下でruby-buildを更新してから実施する。

```bash
cd ~/.rbenv/plugins/ruby-build
git pull
```

　
#### 【３】Ruby のインストール

① ruby-buildを更新
新しいRubyをインストールする際は、さきに以下でruby-buildを更新しておく。
今回は、さっきインストールしたばっかりなので最新になっているはず。

```bash
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
Already up-to-date.
```

　
② インストールできるバージョンを確認する

```bash
$ rbenv install -l

〜 中略 〜
  2.4.0-rc1
  2.4.0
  2.4.1
  2.5.0-dev
〜 中略 〜
```

↑たくさん表示される。「-dev」とか「-preview」とか「-rc」とか付いてないのが安定版。
現時点では、2.4.1 が最新の安定版となっている。

　
③ インストールする
今回は、現時点での最新の安定版である 2.4.1 をインストールする。

```bash
$ rbenv install 2.4.1
Downloading ruby-2.4.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
Installing ruby-2.4.1...
Installed ruby-2.4.1 to /usr/local/ruby/.rbenv/versions/2.4.1

# ↑ インストールできたっぽい？

$ rbenv versions
  2.4.1

# ↑ うん、インストールできてる

$ ruby --version
rbenv: ruby: command not found

The `ruby' command exists in these Ruby versions:
  2.4.1

# ↑ あっれー？ rubyコマンドが無いって？ 「2.4.1にあるよ」的な...

$ rbenv global
system

# ↑ 2.4.1を向いてないからかな？systemってなってる。

$ rbenv global 2.4.1

# ↑ 2.4.1 に切り替えてみる。バージョンの切り替えは「rbenv global バージョン」

$ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

# ↑ でっきたー！ ( ﾉﾟ∀ﾟ)ﾉ

```

　
##### 【補足】特定プロジェクトのみ別のバージョンを指定する方法
そのディレクトリで rbenv local <バージョン> を実行する。
↓
ディレクトリに .ruby-version という名前のファイルが作成され、バージョン指定が有効になる
（ファイルにはバージョン番号のみが記述されている）
↓
echo x.x.x > .ruby-version で、手動でファイルを作成しても同じ。
↓
.ruby-versionファイルで指定されたバージョンは、そのディレクトリのサブディレクトリでも有効になる。


　
##### 【補足】rbenv利用時の、Gemインストール先について
以下にインストールされる。
~/.rbenv/versions/<バージョン>/lib/ruby/gems

※Railsのproduction環境では、--deployment オプションをつけることで、プロジェクトフォルダの vendor/bundle 以下に gem がインストールされる。
（ bundler でインストールする場合は 「 --path vendor/bundle 」　というオプションを指定する）

　
#### 【４】bundler のインストール

Rails は Gem として配布されている。
そして Gem の管理は、bundler という管理ツールが便利なので、まず bundler をインストールして、しかる後に bundler で Rails をインストールする。

なお、bundler 自身もGemとして配布されているので、これは普通に gem install コマンドでインストールする。

```bash
$ gem install bundler
Fetching: bundler-1.14.6.gem (100%)
Successfully installed bundler-1.14.6
Parsing documentation for bundler-1.14.6
Installing ri documentation for bundler-1.14.6
Done installing documentation for bundler after 5 seconds
1 gem installed

# ↑ インストールできたっぽい


$ gem list bundler

*** LOCAL GEMS ***

bundler (1.14.6)

# ↑ うん、はいってる！
```


　
#### 【５】Rails のインストール
上記までで、bundler での Rails インストール準備ができたので、いよいよ Rails をインストールしてみる

　
① アプリケーション用のディレクトリを用意する
Railsのインストール先となるアプリケーションのディレクトリを用意する。

今回はDockerのコンテナを起動するときに、以下のオプションでMacのディレクトリをマウントしているので、

「 -v /Users/miro/docker/cent72/share:/docker-host/share 」
  ( -v Mac側のディレクトリ:CentOS側のディレクトリ )

アプリケーションをそこに構築することで、Mac上から編集できるようにする。

```bash
# ホスト側(Mac側)と共有されているディレクトリに、アプリケーション用のディレクトリを作成
$ mkdir -p /docker-host/share/webapps/myrailsapp
```

　
② Gemfile の生成
アプリケーションのディレクトリに Gemfile を作成し、「 gem "rails" 」を追記してインストールの準備をする

```bash
$ cd /docker-host/share/webapps/myrailsapp
$ bundler init
Writing new Gemfile to /docker-host/share/webapps/myrailsapp/Gemfile
```

Gemfile が生成されたので確認

vi Gemfile

```bash
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
```

↑ rails が既に記述されているので、
↓コメントを外して有効にする

```bash
# gem "rails"
↓
gem "rails"
```

　
##### 【補足】Gemfile で gem のバージョンを指定する方法

```bash
# 最新版をインストール
gem "rails"

# バージョン決め打ち
gem "rails", "5.1.0"

# あるバージョン`以上`の最新版をインストール
gem 'uglifier', '>= 1.3.0'

# 指定のバージョンのマイナーバージョンアップまでならインストールされる 
# （以下の例だと、4.0.9 =>OK  4.1.0=>NG）
gem 'coffee-rails', '~> 4.0.0'
```

　
③ Rails のインストールを実行

bundle install を実行すると、Gemfile に記述したGem（ここではRails）がインストールされる。

ここでは、「 --path vendor/bundle 」というオプションを付けることで、このフォルダ内にインストールしている。
このオプションを付けなければ、さきほど解説したとおり、グローバルなパスである
「 ~/.rbenv/versions/<バージョン>/lib/ruby/gems 」
にインストールされる。

```bash
$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Installing rake 12.0.0
Installing concurrent-ruby 1.0.5
Installing i18n 0.8.1
Installing minitest 5.10.2
Installing thread_safe 0.3.6
Installing builder 3.2.3
Installing erubi 1.6.0
Installing mini_portile2 2.1.0
Installing rack 2.0.2
Installing nio4r 2.0.0 with native extensions
Installing websocket-extensions 0.1.2
Installing mime-types-data 3.2016.0521
Installing arel 8.0.0
Using bundler 1.14.6
Installing method_source 0.8.2
Installing thor 0.19.4
Installing tzinfo 1.2.3
Installing nokogiri 1.7.2 with native extensions
Installing rack-test 0.6.3
Installing sprockets 3.7.1
Installing websocket-driver 0.6.5 with native extensions
Installing mime-types 3.1
Installing activesupport 5.1.0
Installing loofah 2.0.3
Installing mail 2.6.5
Installing rails-dom-testing 2.0.3
Installing globalid 0.4.0
Installing activemodel 5.1.0
Installing rails-html-sanitizer 1.0.3
Installing activejob 5.1.0
Installing activerecord 5.1.0
Installing actionview 5.1.0
Installing actionpack 5.1.0
Installing actioncable 5.1.0
Installing actionmailer 5.1.0
Installing railties 5.1.0
Installing sprockets-rails 3.2.0
Installing rails 5.1.0
Bundle complete! 1 Gemfile dependency, 38 gems now installed.
Bundled gems are installed into ./vendor/bundle.

# ↑ インストールされた！
```

※「SQLite3」や「Node.js」が必要、という記述をみかけるが、今回は特に怒られずにインストールできた。
　　...と思ったけど、あとで怒られる（↓後述）


　
##### 【補足】Rails の依存ライブラリをインストールする「SQLite3」
前述の、bundlerによるRailsのインストールは問題なく完了したが、後述の手順のRailsアプリケーションの作成のところでエラーが出た。

エラーメッセージには、
「Make sure that `gem install sqlite3 -v '1.3.13'` succeeds before bundling.」
とあったので、あちこちの手順で書かれている「SQLite3」というGemが、やっぱり必要らしい。
(RailsのデフォルトのDBがSQLiteになっているため)

なので、ここでインストールしておく

ちなみに「SQLite3」には sqlite-devel という開発ライブラリが必要なので、さきにインストールする

　
①  sqlite-devel をインストール

```bash
sudo yum install -y sqlite-devel
```

　
② Gemfileに sqlite3 を記述

vi Gemfile


```bash
gem "sqlite3"
```

　
③ んで、インストール

```bash
bundle install --path vendor/bundle
```


　
##### 【補足】Rails の依存ライブラリをインストールする「Node.js」
前述の、bundlerによるRailsのインストールは問題なく完了したが、後述の手順のPuma（Rails組み込みのWEBサーバ）の起動でエラーになった。
エラーメッセージには、
「Could not find a JavaScript runtime.」
とあったので、Node.js がやっぱり必要らしい。なので、ここでインストールしておく。

以下、rootユーザで実行

```bash
# curl -sL https://rpm.nodesource.com/setup_6.x | bash -
# yum install -y nodejs
```




### ■ Rails アプリケーションの作成と動作確認
---

#### 【１】Rails アプリケーションの作成

Rails アプリケーションを作成するコマンドは以下。

```bash
bundle exec rails new .
```

「.」を指定することで、カレントディレクトリ名がそのままプロジェクト名になるらしい。
詳しくは次回以降に解説する予定。今回はとりあえず試してみる。

※途中で、Gemfile を上書きしてよいか聞かれるので「Y」で。

```bash
$ cd /docker-host/share/webapps/myrailsapp

$ bundle exec rails new .
〜 中略 〜
Using rails 5.1.0
Installing sass-rails 5.0.6
Bundle complete! 16 Gemfile dependencies, 70 gems now installed.
Bundled gems are installed into ./vendor/bundle.
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted

# ↑ できたっぽい？
```

　
#### 【２】動作確認

① Puma の起動

Rails の組み込みWEBサーバである Puma を起動する。デフォルトでポート3000で接続を受け付ける。

```bash
$ bundle exec rails s
=> Booting Puma
=> Rails 5.1.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.8.2 (ruby 2.4.1-p111), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

　
② とりあえず curl でアクセス確認する

Pumaの起動でターミナルが待ち状態になったので、もうひとつターミナルを起動してCentOSに接続し、curlでRailsアプリケーションにアクセスしてみる

```bash
$ curl http://localhost:3000
<!DOCTYPE html>
<html>
<head>
  <title>Ruby on Rails</title>
〜 中略 〜
      <h1>Yay! You&rsquo;re on Rails!</h1>
〜 中略 〜
</body>
</html>

# ↑ ページを取得できている

# ↓ Puma を起動しているターミナルには、以下のようにアクセスログが出力された

Started GET "/" for 172.17.0.1 at 2017-05-12 23:34:02 +0900
Cannot render console from 172.17.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Rails::WelcomeController#index as HTML
  Rendering vendor/bundle/ruby/2.4.0/gems/railties-5.1.0/lib/rails/templates/rails/welcome/index.html.erb
  Rendered vendor/bundle/ruby/2.4.0/gems/railties-5.1.0/lib/rails/templates/rails/welcome/index.html.erb (7.3ms)
Completed 200 OK in 61ms (Views: 35.2ms)
```

　
③ Macのブラウザからアクセスする
最初のDockerによるCentOS環境構築の際に、3000番ポートをフォワードするように設定しておいたので、MacからDockerゲストのCentOSの3000番ポートへアクセスできる。

「 http://localhost:3000/ 」
![sc.png](https://qiita-image-store.s3.amazonaws.com/0/74523/9b53616a-73a8-5612-776f-956a1694d58b.png "sc.png")

　
できた！今日はここまで！！