CentOS 7とRails 5とMySQL 5.7で使う(3)

# 前置き
本記事は[前回の記事](https://qiita.com/items/8e3b3c0a52000c7e5129)の続編です。
ご覧になっていない方は、前回の記事もご覧になってください。
今回はRailsのプロジェクトを作成してMySQLと連携していることを確認します。
一応、今回で最終回のつもりです。最後までお付き合い頂ければと思います。

# プロジェクトを作成する
1. railsユーザで作業します。
今までrootユーザで作業をしてきましたが、[1回目の記事](https://qiita.com/items/ee66c13100242f756f03)で作成したRailsユーザで作業します。

    ```
    $ id
    uid=1000(rails) gid=1000(rails) groups=1000(rails),10(wheel)
    $ pwd
    /home/rails
    ```

2. プロジェクトを作成します。
この記事の主題であるMySQLを使うようにします。

    ```
    $ rails new myapp -d mysql
               create  
               create  README.md
               create  Rakefile
                 :
                 :
    Your user account isn't allowed to install to the system RubyGems.
          You can cancel this installation and run:
        
          bundle install --path vendor/bundle
        
          to install the gems into ./vendor/bundle/, or you can enter your password
          and install the bundled gems to RubyGems using sudo.
    
          Password:           # railsユーザのパスワード
    
        Installing rake 12.3.1
    Using concurrent-ruby 1.0.5
    Using i18n 1.0.1
                 :
                 :
    Bundle complete! 18 Gemfile dependencies, 78 gems now installed.
    Use `bundle info [gemname]` to see where a bundled gem is installed.
             run  bundle exec spring binstub --all
    * bin/rake: spring inserted
    * bin/rails: spring inserted
    ```

# アプリの事前準備をする
1. JavaScriptの実行環境をインストールします。
このままローカルサーバーで動作させようとするとJavaScriptの実行環境が無いのでエラーになります。
予め回避のためNode.jsとnpmをインストールしておきます。
※EPELリポジトリを追加する必要があります。ConoHaのCentOS 7は追加済みでした。
[参考]EPELリポジトリを追加する場合は以下を実行します。
    ```
    $ sudo -i
    [sudo] rails のパスワード:
    # yum install epel-release
    # exit
    ```
   本線のNode.jsとnpmをインストールします。(sudoでもrootユーザでも)
    ```
    # yum install -y nodejs npm
    ```  

1. DB設定を行います。
  DBの設定ファイルのアカウントをrailsユーザの情報に書き換えます。
    ```
    $ cd ~/myapp
    $ vi config/database.yml 
    ```

    ```yml:database.yml
    default: &default
          username: rails
          password: Hogehoge123!
    ```
1. MySQLにアプリ用DBを作成します。

    ```rails
    $ rails db:create
    Created database 'myapp_development'
    Created database 'myapp_test'
    ```


    ```sql
    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | myapp_development  |
    | myapp_test         |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    6 rows in set (0.00 sec)
    ```
1. web-consoleのホワイトリストを設定します。
  [デフォルトの設定値が127.0.0.1/8](https://railsguides.jp/debugging_rails_applications.html)なので、ローカル環境(サーバーのIPがループバックIP)で開発環境を構築している場合は不要と思います。

    ```
    $ vi ~rails/myapp/config/application.rb 
    ```

    ```rb:application.rb
    config.web_console.whitelisted_ips = 'xxx.xxx.xxx.xxx'    # 接続元のIP
    ```
1. 引き続き、タイムゾーンを設定します。

    ```rb:application.rb
    config.time_zone = 'Tokyo'
    config.active_record.default_timezone = :local
    ```
1. 引き続き、ロケールを設定します。

    ```rb:application.rb
    config.i18n.available_locales = [:en, :ja]
    config.i18n.default_locale = :ja
    ```

1. ファイヤーウォールを一時的に停止します。
デフォルトのRailsサーバーのポート:3000の通信が不通になる可能性がありますので、一時的にファイヤーウォールを停止します。
実環境ではグローバルからの接続はHTTPS(ポート:443)経由になりますので、確認が完了したら元の設定に戻ります。開発環境もHTTPSで構築した方が良いですね。

    ```
    systemctl stop firewalld
    ```
# サーバーを起動する
1. 　プロジェクトのディレクトリへ移動します。  
```rails new myapp -d mysql```を実行したカレントディレクトリは、ホームディレクトリになっていると思います。

    ```
    ＄ ls -l ~
    合計 4
    drwxrwxr-x 14 rails rails 4096  6月 10 23:06 myapp
    ＄ cd ~/myapp
    $ pwd
    /home/rails/myapp
    ```
1. サーバーを起動します。

    ```
    $ rails s
    => Booting Puma
    => Rails 5.2.0 application starting in development 
    => Run `rails server -h` for more startup options
    Puma starting in single mode...
    * Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song
    * Min threads: 5, max threads: 5
    * Environment: development
    * Listening on tcp://0.0.0.0:3000
    Use Ctrl-C to stop
    ```
1. ブラウザからアクセスしてみます。
    http://(ConoHa VPS グローバルIP):3000
    良いじゃないですか:clap::clap:
    <img width="640" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/240974/617ff9fa-3478-a713-0274-e2ec9f767a89.png">
1. 余談です。
バインドオプションを指定しなくても```rails s```で問題無く表示されています。VirtualBoxで検証したときはlocalhost:3000でアクセスしていました。この時はホストOSからゲストOSへのアクセスが「外部アクセス」扱いになりアクセス不可でした。この場合は```rails s -b 0.0.0.0```とバインドオプションを指定してサーバーを起動してあげましょう。

# MySQLと連携しているか確認する

1. Scaffoldで犬モデルを作ります。
    DBをマイグレーションすれば、dogsテーブルが作成されるはずです。
    ```
    $ rails g scaffold dog name:string age:integer
    ```
1. DBをマイグレーションします。
    ```
    $ rails db:migrate
    == 20180611144225 CreateDogs: migrating =======================================
    -- create_table(:dogs)
       -> 0.0078s
    == 20180611144225 CreateDogs: migrated (0.0079s) ==============================
    ```

1. MySQLにテーブルが作成されたか確認してみます。
  1. テーブルがあるか確認します。
dogsテーブルが作成されていますね:dog2::dog2:

        ```sql
        mysql> USE myapp_development;
        USE myapp_development;
        Database changed

        mysql> DESC dogs;
        +------------+--------------+------+-----+---------+----------------+
        | Field      | Type         | Null | Key | Default | Extra          |
        +------------+--------------+------+-----+---------+----------------+
        | id         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
        | name       | varchar(255) | YES  |     | NULL    |                |
        | age        | int(11)      | YES  |     | NULL    |                |
        | created_at | datetime     | NO   |     | NULL    |                |
        | updated_at | datetime     | NO   |     | NULL    |                |
        +------------+--------------+------+-----+---------+----------------+
        5 rows in set (0.00 sec)
        ```

# 犬の情報を登録してみる

1. 一覧へアクセスします。
    http://(ConoHa VPS グローバルIP):3000/dogs
    まだ、ワンちゃんはいません。
    <img width="640" alt="list1.png" src="https://qiita-image-store.s3.amazonaws.com/0/240974/ea568ca0-703f-301c-5c8a-e06e76741857.png">

1. 犬の情報を登録してみます。
    <img width="640" alt="create1.png" src="https://qiita-image-store.s3.amazonaws.com/0/240974/c4dcf11c-5de7-e93e-922e-0b52435811b5.png">
    <img width="640" alt="create2.png" src="https://qiita-image-store.s3.amazonaws.com/0/240974/eeeaa61e-ce11-4639-5058-f2b6e6885265.png">

1. 一覧にも表示されました。
    <img width="640" alt="list2.png" src="https://qiita-image-store.s3.amazonaws.com/0/240974/adaf61f3-588d-5196-975f-0bc6ee9d80f1.png">

1. MySQLにレコードが挿入されたか確認してみます。
あっ！調子にのって3頭も登録していたことがバレてしまいました。我が家の愛犬です。

    ```sql
    mysql> SELECT * FROM dogs;
    +----+--------+------+---------------------+---------------------+
    | id | name   | age  | created_at          | updated_at          |
    +----+--------+------+---------------------+---------------------+
    |  1 | 千代   |    6 | 2018-06-12 00:18:09 | 2018-06-12 00:18:09 |
    |  2 | エル   |    4 | 2018-06-12 00:18:57 | 2018-06-12 00:18:57 |
    |  3 | 乙女   |    7 | 2018-06-12 00:19:09 | 2018-06-12 00:19:09 |
    +----+--------+------+---------------------+---------------------+
    3 rows in set (0.00 sec)

    ```

# 終わりに
本番環境、それに準じたテスト環境の構築はnginxを前段に持ってきてリバースプロキシして、常時SSLで構成することを想定しています。それ自体はRails固有のものではなく、Node.js(Express)なんかでも同様と思いますので、3回に渡ってお送りしたこの記事も一度閉じます。どこかでまた記事にしたいです。
LinuxやRailsに関しては私自身これからWEBアプリを作って行くところで入口に立ったばかりの身ですが、この記事が参考になれば幸いです。
最後にファイヤーウォールを有効に再設定してくださいね。