Docker」カテゴリーアーカイブ

Better Errorsの使い方(エラーが起きた時見るもの Docker環境下)

Better Errorsとは?

Railsの場合、better_errors gemを使うと便利で高機能なエラー画面が表示されます。

Better Errorsの導入方法

Gemfileに以下を記述します↓

group :development do
  gem 'better_errors'      ←追加
  gem 'binding_of_caller'  ←追加
end

docker-compose buildでコンテナをビルド

docker-compose build

/config/environments/development.rbに以下を追加します↓

if Rails.env.development?
  BetterErrors::Middleware.allow_ip! "0.0.0.0/0"
end

docker-compose up などでコンテナを起動すると↓

いつもならこのような表示が

このようになる!

左のペインで処理の流れがわかりやすくなる

右にある情報で、デバッグの手がかりを探す事もできます。

その他デバッグに関しての心得

  • 開発環境であれば画面にエラーの発生箇所が表示されます。
  • 本番環境であればログを読みます。ログにもエラーの発生箇所が表示されます。
  • エラー画面やログを見て、エラーが起きたファイルと行番号を確認します。

実際にエラーが起きたのは自分が書いたコードではなく、gemやフレームワークのコードであることも多いです。Railsのエラー画面であれば Full trace リンクをクリックすると、gemやフレームワークのスタックトレース(バックトレース)が表示されます。

スタックトレースは下から上にメソッドが呼び出された順番が表示されます。スタックトレースを読むことで、エラーが発生するまでにどのファイルのどの行が呼ばれてきたのかを確認できます。

Docker+Railsで開発するときのメモ(自分用メモ)

忘れた時用にDockerを用いた開発のやり方の手順を記載します。

前提:Docker Desktopをインストールしている(OSはMac)
Rubymineで開発している。(VScodeでもできました)
Dドライブ内に作業フォルダ(アプリ名)などを置いている。

  1. Docker.appを起動する(Docker desktop)
  2. RubyMineを起動する(VScodeでもOK)
  3. cdでアプリの作業用フォルダへ移動 例:cd /Volumes/D/アプリ名
  4. docker-compose buildでコンテナを構築する
  5. Could not find rake-13.0.1 in any of the sources Run `bundle install` to install missing gems.というエラーが出た時は↓
  6. docker-compose stopをしてからdocker-compose downでコンテナを削除
  7. Gemfile.lockの記述をすべて削除してから
  8. docker-compose buildでコンテナをまた構築する
  9. docker-compose upでサーバー起動します。
  10. Unknown databaseと出てしまったときは以下のコマンドでデータベースを作成します。
  11. docker-compose exec web bundle exec rake db:create
  12. docker-compose exec web bundle exec rake db:migrate

以上です。

Docker(新規コントローラーの作成とコントローラーの削除)

Dockerでのコントローラ作成方法(コントローラは複数形で)

docker-compose exec web rails g controller tasks create destroy

ビューファイルを生成したくない時(–skip-template-engine: ビューファイルをスキップする設定)

docker-compose exec web rails g controller macs create destroy --skip-template-engine

コントローラーを削除したいとき

docker-compose exec web rails destroy controller tasks

 

 

Gem chart.jsの導入方法(Docker+Rails)

Gemfileに記述します。↓

Gemfile

gem 'rails', '~> 5.1.7'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'bootstrap-sass', '3.3.7'
gem 'font-awesome-sass'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'bcrypt', '~> 3.1.7'
gem 'kaminari'
gem 'rails-i18n', '~> 5.1'
gem 'jbuilder', '~> 2.5'

gem 'chart-js-rails', '~> 0.1.4' ←追加

コンテナを作ります

docker-compose build

コンテナを起動します

docker-compose up -d

コントローラを作成(名前は任意でOKです。ここではsmall_stepsとしている)

docker-compose exec web rails g controller small_steps index

package.jsonに以下を記述します


{
  "name": "chart_js_sample",
  "private": true,
  "dependencies": {
    "chart.js": "^2.7.1" ←追加
  }
}

Railsアプリがライブラリを読み込めるように以下を記述します。

/app/assets/javascripts/application.js
//= require rails-ujs
//= require turbolinks
//= require jquery3
//= require jquery_ujs
//= require jquery
//= require Chart.min  ←追加
//= require bootstrap
//= require_tree .

ビューに以下を記述します。

small_steps/index.html.erb

<h1 class="text-center">スモールステップとビッグエリア</h1>
<canvas id="myChart" width="200" height="200"></canvas>
<script>draw_graph();</script>

Javascript部分はCoffeeScriptに変換します。

app/assets/javascripts/small_steps.coffee
window.draw_graph = ->
  ctx = document.getElementById("myChart").getContext('2d')
  myChart = new Chart(ctx, {
    type: 'bar',
    data: {
      labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
      datasets: [{
        label: '# of Votes',
        data: [12, 19, 3, 5, 2, 3],
        backgroundColor: [
          'rgba(255, 99, 132, 0.2)',
          'rgba(54, 162, 235, 0.2)',
          'rgba(255, 206, 86, 0.2)',
          'rgba(75, 192, 192, 0.2)',
          'rgba(153, 102, 255, 0.2)',
          'rgba(255, 159, 64, 0.2)'
        ],
        borderColor: [
          'rgba(255,99,132,1)',
          'rgba(54, 162, 235, 1)',
          'rgba(255, 206, 86, 1)',
          'rgba(75, 192, 192, 1)',
          'rgba(153, 102, 255, 1)',
          'rgba(255, 159, 64, 1)'
        ],
        borderWidth: 1
      }]
    },
    options: {
      scales: {
        yAxes: [{
          ticks: {
            beginAtZero:true
          }
        }]
      }
    }
  })

http://localhost:3000/small_steps/indexにアクセスすると↓

グラフが描画された!

Docker環境で新規コントローラーの作成

Docker環境でのコントローラを作成するコマンド
tasksの部分は自分が作りたいコントローラー名にする
createとdestroyアクションを作成するという意味

docker-compose exec web rails g controller tasks create destroy --skip-template-engine

–skip-template-engine: ビューファイルをスキップする設定

docker-compose exec web rails g controller tasks create destroy --skip-template-engine

コントローラーを削除したいとき

docker-compose exec web rails destroy controller macs

Dockerでコマンドを忘れた時に見るやつ

コンテナ関連

コンテナの作成

 docker-compose build

コンテナの中身を削除

docker-compose down

コンテナの起動(web serverの起動)

docker-compose.ymlを使って起動します

構文

 docker-compose up [option] [service名]

通常起動

docker-compose up

rails(サービス名)起動

docker-compose up rails

バックグラウンドで実行

docker-compose up -d 
docker-compose up -d rails

buildも実行

docker-compose up -build

buildをしない

 docker-compose up -no-build

コンテナ起動関連

docker-compose start
docker-compose stop

#Gemfileの更新をしたら、実施する
docker-compose restart

コンテナのタイムアウトを秒指定

 docker-compose up -t

サービスの数を指定

docker-compose up -scale SERVICE=サービス数

続きを読む

Docker+rails環境下でモデルの追加方法と1対多の紐付け

データベースを作成するコマンド

docker-compose exec web bundle exec rake db:create

モデルを追加するコマンド

docker-compose run web bundle exec rails g model task user:references name:string cotent:text

モデルを削除したいときのコマンド

docker-compose run web bundle exec rails destroy model task

データベースを削除する場合はこうする

class CreateMacs < ActiveRecord::Migration[5.1]
 def change drop_table :macs
 end
end

マイグレートするためのコマンド

docker-compose exec web bundle exec rake db:migrate

1つ前にロールバックしたいときのコマンド

docker-compose exec web bundle exec rails db:rollback

seedファイルを使う時に、まずはリセット

docker-compose run web bundle exec rails db:migrate:reset

データベース上にサンプルユーザーを生成する

docker-compose run web bundle exec rails db:seed

1対多の場合は1の方(例としてuserとする)has_many :tasks, dependent: :destroyを追加記述することで、userを消したときに紐付いているtaskも削除されるようにできる!

Railsのgem「annotate」の使い方(Docker環境)

annotateとは?

モデルにデータベースのスキーマ構造をannotate(注釈)してくれるGem

テーブルを確認する時にDBに潜る必要がなくなるよ。

Dockerでの使い方

Gemfileのgroup :development doに

gem 'annotate'

を記述します。

docker-compose down でコンテナを削除

docker-compose build でコンテナを作り直し

docker-compose up -dで起動してから次のコマンドをする

docker-compose exec web bundle exec annotate 

変わらなかったときは、次のコマンドをする。

docker-compose exec web bundle exec rails g annotate:install

(次回のマイグレーション以降、自動でアノテーションしてくれるコマンド)

もう一度↓をコマンド

docker-compose exec web bundle exec annotate

Annotated (7): app/models/task.rb, test/models/task_test.rb, test/fixtures/tasks.yml, test/fixtures/tasks.yml, app/models/user.rb, test/models/user_test.rb, test/fixtures/users.yml

↑のようにAnnotetedとなっていれば成功していて、次のように

例:app/models/user.rb

# == Schema Information
#
# Table name: users
#
#  id              :bigint           not null, primary key
#  admin           :boolean          default(FALSE)
#  email           :string(255)
#  name            :string(255)
#  password_digest :string(255)
#  remember_digest :string(255)
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#
# Indexes
#
#  index_users_on_email  (email) UNIQUE
#
class User < ApplicationRecord
  has_many :tasks, dependent: :destroy
  attr_accessor :remember_token
  before_save { email.downcase! }
  validates :name, presence: true, length: {maximum: 15}
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: {maximum: 100},
            format: {with: VALID_EMAIL_REGEX},
            uniqueness: {case_sensitive: false}
  has_secure_password
  validates :password, presence: true, length: {minimum: 5}, allow_nil: true

# == Schema Informationから始まるテーブル情報が記述されていればOKだよ

Rails+Docker環境下で(モデルにカラムを追加する)

Rails+Docker環境下でモデルにカラムを追加するには?

docker-compose run web bundle exec rails g migration AddYYYToXXX カラム名:データ型 (XXXはテーブル名、YYYはカラム名)

docker-compose run web bundle exec rails g migration AddDetailsToLists event:text

複数追加のときはAddDetailsToListsのようにカラム名は任意で良い(単体の場合は追加したいカラム名)

↑のようにマイグレーションファイルが生成される

マイグレートする

docker-compose run web bundle exec rake db:migrate

↑のようにマイグレート成功していればOK!