読者です 読者をやめる 読者になる 読者になる

Ruby on Rails と歩む我が人生

Railsプログラマを目指す漢のRailsとの歩みの記録

Serverspec のインストールと基本的な使い方

Ruby プログラミング Rspec Serverspec

はじめに

Infrastructure as Codeを推進するべく、今更感もありますが、テストにServerspecを使用してみたいと思いますよ!

環境

  • Serverspecを実行する方
  • テストを受ける方

本記事で触れること

  • Serverspecのインストール
  • sample_spec.rbを使ったテスト

SSHでのテストとなります。

インストール&セットアップ

Rubyのインストール

ServerspecはRspecを利用したテスティングフレームワークなので、もちろんRubyのインストールが必須となります。

以下のようなスクリプトでも書いてささっとインストールしてしまいましょう。

#!/bin/bash

# rbenvと関連プラグインのダウンロード
cd /opt
git clone https://github.com/sstephenson/rbenv.git
mkdir -p /opt/rbenv/plugins
cd /opt/rbenv/plugins
git clone https://github.com/sstephenson/ruby-build.git

# .bashrcへのrbenv関連設定追加
grep "rbenv global config" ${HOME}/.bashrc > /dev/null 2>&1
if [ $? -ne 0 ]; then
  echo >> ~/.bashrc
  echo "# rbenv global config" >> ~/.bashrc
  echo 'export RBENV_ROOT="/opt/rbenv"' >> ~/.bashrc
  echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> ~/.bashrc
  echo 'eval "$(rbenv init -)"' >> ~/.bashrc
fi

# Ruby関連モジュールのインストール
yum -y install gcc make openssl-devel libffi-devel ruby-devel readline-devel rubygems sqlite-devel bzip2

# Rubyのインストール
/bin/bash -lc "rbenv install 2.3.0"
/bin/bash -lc "rbenv rehash"
/bin/bash -lc "rbenv global 2.3.0"

Serverspecのインストール

インストール&セットアップ方法

Serverspecのインストール
# gem install serverspec
Serverspec初期セットアップ
# serverspec-init

とすると、こんな画面が出てきます。
※{HOSTNAME}の部分は読み替えて下さい。

Select OS type:

      1) UN*X
      2) Windows

    Select number: 1

    Select a backend type:

      1) SSH
      2) Exec (local)

    Select number: 1

    Vagrant instance y/n: n
    Input target host name: {HOSTNAME}
     + spec/
     + spec/{HOSTNAME}/
     + spec/{HOSTNAME}/sample_spec.rb
     + spec/spec_helper.rb

SSH設定

SSHで接続してテストを実行するため、下記コマンドでSSH鍵をリモートホストへ渡します。

# ssh-copy-id ${HOSTNAME}
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@${HOSTNAME}'s password: ※パスワードを入力

テストの実行

すでにカレントディレクトリには以下のような構成でファイルが生成されているので、このままテストをしてみます。

spec/
spec/{HOSTNAME}/
spec/{HOSTNAME}/sample_spec.rb
spec/spec_helper.rb

以下のコマンドでテストを実行

# rake spec
(in /root/serverspec/work/20170122)
/opt/rbenv/versions/2.2.3/bin/ruby -I/opt/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-support-3.5.0/lib:/opt/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.5.4/lib /opt/rbenv/versions/2.2.3/lib/ruby/gems/2.2
.0/gems/rspec-core-3.5.4/exe/rspec --pattern spec/${HOSTNAME}/\*_spec.rb

Package "httpd"
  should be installed (FAILED - 1)

Service "httpd"
  should be enabled (FAILED - 2)
  should be running

Port "80"
  should be listening

Failures:

  1) Package "httpd" should be installed
     On host `${HOSTNAME}'
     Failure/Error: it { should be_installed }
       expected Package "httpd" to be installed
       /bin/sh -c rpm\ -q\ httpd
       package httpd is not installed

     # ./spec/${HOSTNAME}/sample_spec.rb:4:in `block (2 levels) in <top (required)>'

  2) Service "httpd" should be enabled
     On host `${HOSTNAME}'
     Failure/Error: it { should be_enabled }
       expected Service "httpd" to be enabled
       /bin/sh -c chkconfig\ --list\ httpd\ \|\ grep\ 3:on

     # ./spec/${HOSTNAME}/sample_spec.rb:12:in `block (2 levels) in <top (required)>'

Finished in 0.83381 seconds (files took 1.49 seconds to load)
4 examples, 2 failures

Failed examples:

rspec ./spec/${HOSTNAME}/sample_spec.rb:4 # Package "httpd" should be installed
rspec ./spec/${HOSTNAME}/sample_spec.rb:12 # Service "httpd" should be enabled

/opt/rbenv/versions/2.2.3/bin/ruby -I/opt/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-support-3.5.0/lib:/opt/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.5.4/lib /opt/rbenv/versions/2.2.3/lib/ruby/gems/2.2
.0/gems/rspec-core-3.5.4/exe/rspec --pattern spec/${HOSTNAME}/\*_spec.rb failed

テスト結果の検証

まずは実行されたsample_spec.rbを確認

require 'spec_helper'

describe package('httpd'), :if => os[:family] == 'redhat' do
  it { should be_installed }
end

describe package('apache2'), :if => os[:family] == 'ubuntu' do
  it { should be_installed }
end

describe service('httpd'), :if => os[:family] == 'redhat' do
  it { should be_enabled }
  it { should be_running }
end

describe service('apache2'), :if => os[:family] == 'ubuntu' do
  it { should be_enabled }
  it { should be_running }
end

describe service('org.apache.httpd'), :if => os[:family] == 'darwin' do
  it { should be_enabled }
  it { should be_running }
end

describe port(80) do
  it { should be_listening }
end

これは以下のテストとなっていて、且つOS毎に判定して条件分岐しているテスト内容となっています。

  • Apacheがインストールされているか
  • Apacheが起動しているか
  • Apache自動起動設定されているか
  • Port80がリッスンしているか

テスト内容的にはとあるパッケージソフトに入っているApacheなので、通常のApacheはインストールされていない、且つ、起動はしているが自動起動設定はされておらず、ポートはリッスンしているという正しいテスト結果をなっています。

おわりに

はじめてのServerspecでしたが、色々なテストができそうなので自分なりのベスト・プラクティスを構築してInfrastructure as Codeを実施していければと思います!

rails serverでポートとIPアドレスを指定する方法

Rails プログラミング 備忘録

はじめに

例えば同じ開発環境で複数プロジェクト開発していて、こっちのプロジェクトはポート3000で、こっちのプロジェクトはポート3001でみたいなケースはよくあると思うのですが、その際の対応方法となります。

やりかた

IPアドレスの指定方法

まず、なんのオプションもなく、rails serverコマンドを打つとこんな感じとなります。

$ rails server
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-12-16 12:30:59] INFO  WEBrick 1.3.1
[2016-12-16 12:30:59] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-16 12:30:59] INFO  WEBrick::HTTPServer#start: pid=6111 port=3000

この場合、デフォルトポートは3000となり、IPはlocalhost(127.0.0.1)となります。Macなどローカル開発している場合は特に問題ないのですが、他のサーバーにSSHで接続して開発している場合、接続することができません。

なので、以下の-bオプションでIPアドレスを指定します。

$ rails s -b 172.20.7.61
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://172.20.7.61:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-12-16 12:38:58] INFO  WEBrick 1.3.1
[2016-12-16 12:38:58] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-16 12:38:58] INFO  WEBrick::HTTPServer#start: pid=6241 port=3000

このように変更することができます!

ポート番号の指定方法

別のプロジェクトを同一環境で開発していて別ポートでWEBサーバーを立ち上げたいなどの場合に活用できます。

-pオプションでポート番号を指定してあげるだけですね!

$ rails s -p 3200
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://localhost:3200
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-12-16 12:44:33] INFO  WEBrick 1.3.1
[2016-12-16 12:44:33] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-16 12:44:33] INFO  WEBrick::HTTPServer#start: pid=6354 port=3200

IP指定のオプションと組み合わせることも可能です!

$ rails s -b 172.20.7.61 -p 3100
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://172.20.7.61:3100
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-12-16 12:45:40] INFO  WEBrick 1.3.1
[2016-12-16 12:45:40] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-12-16 12:45:40] INFO  WEBrick::HTTPServer#start: pid=6407 port=3100

おわりに

Railsを勉強し始めた時期に地味にここでハマった記憶がありますw

Railsはプログラミングだけではなくインフラ周りの知識も必要となるのでやっていて本当に楽しいっす^^

Railsでインスタンス変数が生成するコードがつらい話

Ruby Rails プログラミング

はじめに

RubyRailsではわりとコードが省略して書けるため、初学者(ぼく)のみなさんはそれは苦しめられていると思います。 Scaffoldで生成されるコードとかもうほんと一言で言い表すと「挫折」って感じですね!

環境作成

こちらの手順で作成した環境となります!

qiita.com

つらいところ

index.html

scaffoldで作成されたデフォルトのコード

対象ファイル:${rails_root}/app/views/notes/index.html.erb

<p id="notice"><%= notice %></p>

<h1>Listing Notes</h1>

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @notes.each do |note| %>
      <tr>
        <td><%= note.title %></td>
        <td><%= note.content %></td>
        <td><%= link_to 'Show', note %></td>
        <td><%= link_to 'Edit', edit_note_path(note) %></td>
        <td><%= link_to 'Destroy', note, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Note', new_note_path %>
index画面はこんな感じ

f:id:tocguitar1:20161215143954p:plain

まぁ、これはわかる。

このコードをリファクタリングしていく

まずindex.htmlの下記部分をパーシャルにする。

${rails_root}/app/views/notes/_note.html.erb

<tr>
  <td><%= note.title %></td>
  <td><%= note.content %></td>
  <td><%= link_to 'Show', note %></td>
  <td><%= link_to 'Edit', edit_note_path(note) %></td>
  <td><%= link_to 'Destroy', note, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>

そして、index.htmlを以下のように書き換える。

<p id="notice"><%= notice %></p>

<h1>Listing Notes</h1>

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>
    <% @notes.each do |note| %>
      <%= render 'note', note: note %>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Note', new_note_path %>

ぼくは正直この時点でだいぶつらい感じを覚えました。この部分ですね。

<% @notes.each do |note| %>
  <%= render 'note', note: note %>
<% end %>

これはnotes_controller.rbのindexアクションで定義されているインスタンス変数@notesNote.allで全てのNoteテーブルに関する情報をいれていて、それをeachで回しているというのが基本なのですが、先程パーシャル化した_note.html.erbrenderで呼出し、パーシャルで用いられている変数note:にeachで持ってきたnoteインスタンスを渡しているという処理になります。

さらにリファクタリングをする

このindex.html.erbをさらにこんな感じでリファクタリングすることができます。

<p id="notice"><%= notice %></p>

<h1>Listing Notes</h1>

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>
    <% @notes.each do |note| %>
      <%= render note %>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Note', new_note_path %>

はい!ツライですね!これは非常にツライ!

# 変更前
<% @notes.each do |note| %>
  <%= render 'note', note: note %>
<% end %>

# 変更後
<% @notes.each do |note| %>
  <%= render note %>
<% end %>

なんと以下のコードは

<%= render note %>

以下のコードを生成するのです!!

<%= render 'note', note: note %>

ああああ、ツライ!!!ツライよおおお!!

正直このあたりはなんでこういう動きをしているのか全くわかっておりません。今度調べて追記するかもしれないですが、どうでしょうか。

ここからさらにリファクタリングをする

なんと最終的にはこういうふうに記載ができます。

<p id="notice"><%= notice %></p>

<h1>Listing Notes</h1>

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>
    <%= render @notes %>
  </tbody>
</table>

<br>

<%= link_to 'New Note', new_note_path %>

あsdfjk;qうぇるいおp!!!

# 変更前
<% @notes.each do |note| %>
  <%= render note %>
<% end %>

# 変更後
<%= render @notes %>

もはやまったくわけがわからなくなってきましたが、要するにこういうことらしい。

以下のコードは

<%= render @notes %>

以下のコードを生成する!!!!

<% @notes.each do |note| %>
  <%= render note %>
<% end %>

おわりに

第一線で活躍するRailsプログラマーのみなさんにおかれましては本記事はカスのような内容すぎて逆に内を言いたいのかわからないかと思われますが、安心してください。

ぼくもよくわからなくってまいりました。

そもそもタイトルにある「インスタンス変数が生成するコード」というのも完全に間違っている可能性がありますが、第一線で活躍するRailsプログラマーのみなさんにおかれましてはマサカリを投げる事なく優しいご指導を頂けると嬉しいですのでそこのところよろしくお願いします!

bundle install で「g++: コマンドが見つかりませんでした」となる場合の解決方法

Rails プログラミング 備忘録

はじめに

Railsでプロジェクトを作成し、bundle installでgemをインストールしようとしたところエラーが出てgemをインストールできなかったのでその解決方法です。

エラーへの対処方法

表示されたエラー

こんな感じです

$ bundle install
 ~~中略~~
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /opt/rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/therubyracer-0.12.2/ext/v8
/opt/rbenv/versions/2.3.0/bin/ruby -r ./siteconf20161215-665-1qmq28n.rb extconf.rb
checking for main() in -lpthread... yes
creating Makefile

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /opt/rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0-static/therubyracer-0.12.2/mkmf.log

current directory: /opt/rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/therubyracer-0.12.2/ext/v8
make "DESTDIR=" clean

current directory: /opt/rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/therubyracer-0.12.2/ext/v8
make "DESTDIR="
compiling primitive.cc
make: g++: コマンドが見つかりませんでした
make: *** [primitive.o] エラー 127

make failed, exit code 2

Gem files will remain installed in /opt/rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/therubyracer-0.12.2 for inspection.
Results logged to /opt/rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0-static/therubyracer-0.12.2/gem_make.out

An error occurred while installing therubyracer (0.12.2), and Bundler cannot continue.
Make sure that `gem install therubyracer -v '0.12.2'` succeeds before bundling.

ようするにこの部分ですね。

make: g++: コマンドが見つかりませんでした

対処方法

エラーにある通り、g++をインストールしてあげます。

$ yum install gcc-c++

再度bundle installを実施

$ bundle install
~~中略~~
Bundle complete! 13 Gemfile dependencies, 59 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

そんな感じで!

db:migrateがうまくいかない場合の対処方法

Rails Ruby プログラミング 備忘録

はじめに

少し考えればごくごく当たり前のことですがぼくはハマってしまったのでその備忘録です。

ケース

  • User機能をScaffoldで作成し、rake db:migrateを実行
  • git commit後、git resetで以前のコミットに戻る
  • 再度User機能をScaffoldで作成、rake db:migrateを実行するもエラーでうまくいかない

環境

  • Cloud9環境
  • 開発環境でのSQLiteでの事象

詳細

エラー内容

tocyuki:~/workspace (develop) $ rake db:migrate
== 20161213035900 CreateUsers: migrating ======================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: table "users" already exists: CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "email" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) 
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `initialize'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `new'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `prepare'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:137:in `execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:329:in `block in execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:472:in `block in log'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.5/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:466:in `log'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:329:in `execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:208:in `create_table'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:665:in `block in method_missing'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:634:in `block in say_with_time'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:634:in `say_with_time'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:654:in `method_missing'
/home/ubuntu/workspace/db/migrate/20161213035900_create_users.rb:3:in `change'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:608:in `exec_migration'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:592:in `block (2 levels) in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:591:in `block in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:292:in `with_connection'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:590:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:768:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:998:in `block in execute_migration_in_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:1044:in `block in ddl_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/transaction.rb:184:in `within_new_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/transactions.rb:220:in `transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:1044:in `ddl_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:997:in `execute_migration_in_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:959:in `block in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:955:in `each'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:955:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:823:in `up'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:801:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/tasks/database_tasks.rb:137:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/railties/databases.rake:44:in `block (2 levels) in <top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/gems/rake-11.3.0/exe/rake:27:in `<top (required)>'
ActiveRecord::StatementInvalid: SQLite3::SQLException: table "users" already exists: CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "email" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) 
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `initialize'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `new'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `prepare'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:137:in `execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:329:in `block in execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:472:in `block in log'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.5/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:466:in `log'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:329:in `execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:208:in `create_table'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:665:in `block in method_missing'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:634:in `block in say_with_time'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:634:in `say_with_time'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:654:in `method_missing'
/home/ubuntu/workspace/db/migrate/20161213035900_create_users.rb:3:in `change'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:608:in `exec_migration'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:592:in `block (2 levels) in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:591:in `block in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:292:in `with_connection'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:590:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:768:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:998:in `block in execute_migration_in_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:1044:in `block in ddl_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/transaction.rb:184:in `within_new_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/transactions.rb:220:in `transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:1044:in `ddl_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:997:in `execute_migration_in_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:959:in `block in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:955:in `each'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:955:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:823:in `up'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:801:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/tasks/database_tasks.rb:137:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/railties/databases.rake:44:in `block (2 levels) in <top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/gems/rake-11.3.0/exe/rake:27:in `<top (required)>'
SQLite3::SQLException: table "users" already exists
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `initialize'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `new'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:91:in `prepare'
/usr/local/rvm/gems/ruby-2.3.0/gems/sqlite3-1.3.12/lib/sqlite3/database.rb:137:in `execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:329:in `block in execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:472:in `block in log'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.5/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract_adapter.rb:466:in `log'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/sqlite3_adapter.rb:329:in `execute'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:208:in `create_table'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:665:in `block in method_missing'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:634:in `block in say_with_time'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:634:in `say_with_time'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:654:in `method_missing'
/home/ubuntu/workspace/db/migrate/20161213035900_create_users.rb:3:in `change'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:608:in `exec_migration'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:592:in `block (2 levels) in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:591:in `block in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:292:in `with_connection'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:590:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:768:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:998:in `block in execute_migration_in_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:1044:in `block in ddl_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/transaction.rb:184:in `within_new_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/transactions.rb:220:in `transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:1044:in `ddl_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:997:in `execute_migration_in_transaction'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:959:in `block in migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:955:in `each'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:955:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:823:in `up'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/migration.rb:801:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/tasks/database_tasks.rb:137:in `migrate'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/railties/databases.rake:44:in `block (2 levels) in <top (required)>'
/usr/local/rvm/gems/ruby-2.3.0/gems/rake-11.3.0/exe/rake:27:in `<top (required)>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

対処方法

長々とエラーを記載しましたがようするにこの一行に全て書いてあるというわけですね! 「usersテーブルもうあるよ!!」

SQLite3::SQLException: table "users" already exists

対象のテーブルを削除

rails dbconsoleSQLiteをいじっていきます。

tocyuki:~/workspace (develop) $ rails dbconsole
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

usersテーブルが存在するか確認

sqlite> .tables
notes              schema_migrations  users  

usersテーブルを削除

sqlite> drop table users

削除されたか確認

sqlite> .tables
notes              schema_migrations

再度migrationを実施

tocyuki:~/workspace (develop) $ rake db:migrate
== 20161213035900 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0013s
== 20161213035900 CreateUsers: migrated (0.0014s) =============================

エラー出ずにうまくいきました!

おわりに

gitでまえのコミットに戻ってDBをそのままにしていたのが原因ということですね!

人生とRailsは難しいですね!