この記事について…
普段はRuby on Railsと無縁なプログラマなんですが、今更ながら面白そうという単純な理由からRuby on Rails Tutorialをやってみようと思い立ちました。今回は前回の記事の続きで第7章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつVagrantを使用した環境で進めていきます。
※最近私用で忙しくなってしまった為、Rails Tutorialの更新頻度は落とそうと思います。ただ、別件でRaspberry Pi関係の学習が必要になった為、そちらについては逐一更新しようと思っています。
第7章 ユーザー登録
この章ではブラウザ上からUserモデルを登録する画面を作成します。普段お世話になっているWebアプリケーションでほぼほぼ存在する機能ですね。
データベースの内容をリセットする際につまずく
rails db:migrate:reset
を実行してデータベースの内容を一旦リセットする際に次のエラーが発生しました。
Text file busy @ unlink_internal - /vagrant_data/environment/sample_app/db/development.sqlite3
Couldn't drop database 'db/development.sqlite3'
rails aborted!
Errno::ETXTBSY: Text file busy @ unlink_internal - /vagrant_data/environment/sample_app/db/development.sqlite3
/vagrant_data/environment/sample_app/bin/rails:9:in `require'
/vagrant_data/environment/sample_app/bin/rails:9:in `<top (required)>'
/vagrant_data/environment/sample_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)
情報を探ったところ、RailsHackさんのページに原因が記述されていました。(参考になりました。ありがとうございます。)
どうも今回のようにゲストOSとホストOS間で共有フォルダを使用して開発している場合に発生することがあるようです。
ちなみに、今回使用させていただいているVagrantの設定ファイルだと、/vagrant
と/vagrant_data
がホストOSと共有されていますので、それ以外のディレクトリにデータベースを移動する必要があります。
今回は以下の手順で一時的にデータベースの位置を移動してリセットを行いました。
-
~/rails/sample_app
にdevelopment.sqlite3
とtest.sqlite3
をコピーする。 -
database.yml
を編集する。 -
rails db:migrate:reset
を実行する。 ⇒ リセットが成功する。RAILS_ENV=test
でも実行することをお忘れなく。 -
database.yml
の変更箇所を元に戻す。 - 元の場所に、
~/rails/sample_app
内のdevelopment.sqlite3
とtest.sqlite3
を上書きする。
.
.
development:
<<: *default
database: /home/vagrant/rails/sample_app/development.sqlite3 #ディレクトリを変更
.
test:
<<: *default
database: /home/vagrant/rails/sample_app/test.sqlite3 #ディレクトリを変更
.
.
rails db:migrate:reset
を成功させることを重視したので上記手段を取りましたが、結局やりたいことはSQLiteの中身を消したいだけなので、DB Browser for SQLiteを使用するなりなんなりすればいいかもしれませんね。
さて、この章では他にHeroku環境でSSLを使用する等かなり実環境に近い設定を学ぶことができます。
以降の章ではログイン機構の実装、登録したユーザーの一覧表示等、必要不可欠な機能を実装していくようなので、また時間を見つけて進めていこうと思います。
それでは、次回 第8章から再開したいと思います。