桜色HelloWorld

アイマスP兼エンジニアの雑記。

DockerでRailsチュートリアル(Toyアプリ編1)

前回の続きからです。さっそく2章に進みましょう。

チュートリアルではHelloWorld編の最後にGitHub/BitbucketへのpushとHerokuへのデプロイをやっていますが、 本記事では(今後も)省略しますので、実施したい人は個々で対応をお願いします。
後々になって記事にした方が良さそうなら別記しようと思います。

Toyアプリ環境準備

まずは環境構築です。HelloWorld編の時と同じで rails new で作っていきます。
Dockerに入り、ホストと共有しているフォルダでコマンドを入れていきましょう。 (Dockerへの入り方は前回と同じなので、省略します)

# cd /var/www
# rails _5.1.6_ new toy_app

ホスト側で共有されていることを確認。
f:id:rikka-rt:20181109234706p:plain:w300

次にGemfileを修正します。 HelloWorld編で掲載したGemfileとの差異は、最後の方にproduction環境用のpg(PostgreSQL)が追加されている部分だけです。
なお、HelloWorld編でHerokuの設定まで行っている場合は、(Gemfileの状態が同じになるため)前回のファイルから抜粋してくるのもOKです。

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

gem 'rails', '5.1.6'
gem 'puma', '3.9.1'
gem 'sass-rails', '5.0.6'
gem 'uglifier', '3.2.0'

gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks', '5.0.1'
gem 'jbuilder', '2.7.0'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug', '9.0.6', platform: :mri
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
end

group :development do
  gem 'web-console', '3.5.1'
  gem 'listen', '3.1.5'
  gem 'spring', '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :production do
  gem 'pg', '0.20.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

保存したら bundle install しますが、PostgreSQLのgemは本番用なので、オプションをつけて除外します。

# cd /var/www/toy_app
# bundle install --without production

続けて、ControllerとRouteを設定します。設定内容はHelloWorld編と同じなので復習のつもりで変更していきます。
toy_app\app\controllers\application_controller.rb は以下のように。

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def hello
    render html: "hello, world!"
  end
end

toy_app\config\routes.rb は以下のように。

Rails.application.routes.draw do
  root 'application#hello'
end

チュートリアルでは、ここまでの修正分をGitHub/Bitbucketにpushし、Herokuにデプロイしますが、最初に記載した通り省略します。

続いて、モデルの作成に進みます。

Userモデル作成

とりあえず、書いてある通りに進めていきます。
bundle install 後なので、toy_app にいるままでコマンドを入れていきます……が。

# rails generate scaffold User name:string email:string
Could not find pg-0.20.0 in any of the sources
Run `bundle install` to install missing gems.

エラーが出ました。
特にエラーが出なかった方は、そのまま進めてください。


エラー対応 ここから

pgのgemが見つからない? みたいな感じですね。
PostgreSQLのgemはproduction用になっているはずなのに、なぜこうなるのか……。

で、新規にコンテナを立てて色々と試して見ましたが、根本原因がよくわかりませんでした。 仕方がないので、pgをproduction以外でも使用するように、Gemfileを変更して進めることにしました。
(原因に心当たりがある方は、教えていただけると助かります)

#group :production do
  gem 'pg', '0.20.0'
#end

Gemfileを修正後、bundle install してから先ほどエラーになったgenerateコマンドを実行します。

# bundle install --without production
# rails generate scaffold User name:string email:string

エラー対応 ここまで


scaffoldという機能?で、toy_app\db\migrate にファイルができました。

f:id:rikka-rt:20181116020008p:plain:w300

続いて、dbのマイグレーション

# rails db:migrate

ここまで実行すると、ローカルサーバーが起動できるようなので、確認します。

# rails server

http://localhost:8080/users にアクセスしてみました。
(以降、ホストとコンテナを繋ぐポートを8080として記載しますので、各自の環境に合わせて変更してください)

f:id:rikka-rt:20181116021319p:plain:w200

チュートリアルと微妙に違いがありますが)無事に表示されていますね。
続いて、New User のリンクから http://localhost:8080/users/new にアクセスします。 アクセスしたら登録するテストユーザーの情報を入力しましょう。

f:id:rikka-rt:20181117002710p:plain:w200

入力したら Create User ボタンを押下。

f:id:rikka-rt:20181117010033p:plain:w200

以降、チュートリアルに従って「ユーザ情報の変更」「2人目のユーザー追加」「追加したユーザーの削除」を 実施して、動作を確認します。

今回はここまでです。