しふみんのブログ

しふみんのブログです。

Heroku+RailsでLine botを作る 第6回 Railsアプリの作成

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、必要なパッケージの導入し、Rubyをインストールしました。
そして、プロジェクトディレクトリをバージョン管理できるようにGitリポジトリ化しました。
さらに、Bunblerを導入してrails gemをインストールしました。
今回は、(本当に!やっと!)Railsアプリを作成していきたいと思います。

rails new

ようやくのようやくで、Railsアプリの作成コマンドの実行までたどり着きました!
下記の rails new コマンドでRailsアプリを作成します。
コマンド実行後にOverwriteするかを聞かれたら全て y で問題ありません。

bundle exec rails new . --database=postgresql --skip-bundle --skip-test

rails new の各オプションの詳細は下記をご参照ください(投げ)

railsコマンド(rails) - - Railsドキュメント

それぞれのオプション他を軽く一言説明をしますと、

  • bundle exec
    • Bundlerでインストールしたカレントディレクリのgemのrailsコマンドを使用する
  • .
    • カレントディレクリにRailsアプリを作成する
  • --database=postgresql
  • --skip-bundle
    • bundle installを行わない -> 後で手動で行うため
  • --skip-test
    • test::unitを組み込まない -> この連載では(今のところは)テストを省略します

となります。
加えて、1点だけ補足説明しておきます。
前回の第5回の記事で bundle instlal したと思います。
あの bundle installrails gemをインストールするためのものです。
そして、実はもう一度 bundle install する必要があります。
次の bundle installRailsアプリを動かすために必要な他のgemをインストールするためのものになります。

ls -la で確認すると下記のようにRailsアプリの各ファイルが作成されていることと思います。

ls -la
total 32
drwxr-xr-x 22 shifumin staff  704  4 24 23:33 .
drwxr-xr-x 11 shifumin staff  352  4 22 11:51 ..
drwxr-xr-x  3 shifumin staff   96  4 24 22:09 .bundle
drwxr-xr-x  9 shifumin staff  288  4 24 23:33 .git
-rw-r--r--  1 shifumin staff  604  4 24 23:33 .gitignore
-rw-r--r--  1 shifumin staff    5  4 24 23:33 .ruby-version
-rw-r--r--  1 shifumin staff 1969  4 24 23:33 Gemfile
-rw-r--r--  1 shifumin staff 2911  4 24 22:11 Gemfile.lock
-rw-r--r--  1 shifumin staff  374  4 24 23:02 README.md
-rw-r--r--  1 shifumin staff  227  4 24 23:02 Rakefile
drwxr-xr-x 10 shifumin staff  320  4 24 23:33 app
drwxr-xr-x  8 shifumin staff  256  4 24 23:33 bin
drwxr-xr-x 16 shifumin staff  512  4 24 23:33 config
-rw-r--r--  1 shifumin staff  130  4 24 23:33 config.ru
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 db
drwxr-xr-x  4 shifumin staff  128  4 24 23:33 lib
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 log
-rw-r--r--  1 shifumin staff   66  4 24 23:33 package.json
drwxr-xr-x  9 shifumin staff  288  4 24 23:33 public
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 storage
drwxr-xr-x  5 shifumin staff  160  4 24 23:33 tmp
drwxr-xr-x  4 shifumin staff  128  4 24 23:33 vendor

しかし、まだRailsアプリは動きません。
なぜならRailsアプリを動かすために必要な各gemがインストールされていないためです。
中身は載せませんが、 rails new 前は gem "rails" の行のみでしたGemfileにRailsアプリを動かすために必要な様々なgemが追加されていると思います。
これらのgemをインストールしていく必要があります。

line-bot-sdk-ruby gemの追加

追加されたgemをインストールする前にLINE bot開発に必要なgemを追加します。
下記の line-bot-api です。

github.com

Gemfileの一番最後に gem 'line-bot-api' の行を追加しましょう。
line-bot-apiの機能や使い方については実装時に追々見ていくことにします。

(前略)
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem 'line-bot-api'

余談ですが、gem名の記述が bundle init で作成したGemfileは "" で括られており、 rails new で上書き作成したGemfileは '' で括られていることを今回初めて知りました。
不思議ですね。

bundle install

2回目の bundle install です。
初回時に --path vendor/bundle オプションをつけていた場合、2回目以降はつけなくても ./vendor/bundle にインストールされます。
Bundlerの設定ファイルである .bundle/config の中身を見てみると、下記のように BUNDLE_PATH の設定があると思います。
これのおかげで、2回目以降は --path オプションが必要ないというわけです。

 ---
 BUNDLE_PATH: "vendor/bundle"

それでは追加されたgemを bundle install でインストールしましょう(今回も数分ほどかかるはずです)

bundle install

これで、ようやくRailsアプリを起動させる準備が整いました(大嘘)

rails s

Railsアプリ(のサーバ)を起動させるには rails s コマンドを利用します。

bundle exec rails s # bundle exec rails server でも bin/rails s でも bin/rails server でも可

下記のような出力が出るはずです。

=> 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
Use Ctrl-C to stop

Railsアプリが起動しましたね。
ちなみに、先に書いておくとアプリの起動を止める方法は最後の行に書いてあるように Ctrlボタン + C 同時押しです。

Railsアプリを起動させた状態でブラウザで確認してみましょう。
ローカル環境(Mac)で rails sRailsアプリを起動させた場合は http://localhost:3000/ でアプリを確認できます。
それではブラウザで確認してみます。

f:id:shifumin:20180425235639p:plain

Oh……

PG::ConnectionBad というエラーが出ていますね。
could not connect to server と怒られました。
そうです、データベースサーバのPostgreSQL(PG)の準備を何もしていないからです。

PostgreSQLのインストール

PostgreSQLについては下記をご参照ください(定期投げ)

(公式サイトがメンテ中なので後でここに貼ります)

インストール方法その他の詳細についてはこちらをご参照ください。

qiita.com

Homebrewでインストールし、データベースクラスタRuby(Rails)のデフォルトエンコーディングである UTF-8 で初期化します。

brew install postgresql
initdb /usr/local/var/postgres -E utf8

初期化が完了したら、下記のコマンドでPostgreSQLサーバを起動させます。

brew services start postgresql # 停止コマンドは brew services stop postgresql

それでは、PostgreSQLサーバも起動させたことですし、再びRailsアプリを起動させてブラウザで確かめてみましょう。

bundle exec rails s

f:id:shifumin:20180425235540p:plain

Oh……(2回目)
今度は ActiveRecord::NoDatabaseError というエラーが出ました。
FATAL: database "line_bot_development" does not exist とデータベースがないって怒られていますね。
そうです(2回目)、DBサーバは起動させましたが、肝心のデータベースをまだ作成していません。
データベースの作成(初期化)はrailsコマンドが良きに計らってやってくれます。
下記の rails db:create コマンドです。

bundle exec rails db:create
Created database 'line_bot_development'
Created database 'line_bot_test'

データベースが作られました(開発環境用DBとテスト用DB)
これで本当の本当の本当にRailsアプリを起動させる準備が整いました(真)

rails s再び

それでは、 rails sRailsアプリを起動させてブラウザで http://localhost:3000/ を確認しましょう。

bundle exec rails s

f:id:shifumin:20180425235424p:plain

無事にRailsアプリが起動できましたね。
お疲れ様でした(僕が)(今回の記事は長かった……)

終わりに

今回はRaisアプリの作成を行い、起動させ、確認しました。
次回はこのRails上にbotの実装を進めていきましょう。
ようやく本編がスタートする気がします。

参考

railsコマンド(rails) - - Railsドキュメント
http://railsdoc.com/rails

line/line-bot-sdk-ruby: Line: :API - SDK of the LINE Messaging API for Ruby.
https://github.com/line/line-bot-sdk-ruby

MacにPostgreSQL9.6.3をインストールしてみた - Qiita
https://qiita.com/uhooi/items/cd6256a72c6a03621c09