SinatraでActive Recordを使い、マイグレーションを実行しよとしたときにめちゃめちゃつまずいた話です。
解決編はこちらからどうぞ。
https://sunnydayservice.qrunch.io/entries/OtGeYUlG7WWdWgvA
cannot load such file -- sinatra/activerecord
のエラーから始まり、しばらくどうしていいか分かりませんでした。
多大なる記事を参考にしましたが、参考にした記事を載せると、「この記事の通りにやっても出来ひんのかーい!」ってなるので、特に分かりやすいなと思った記事を参考に上げさせてもらいます。
記事通りに設定したのに、rake
コマンドでマイグレーションできなかった方に向けた内容です。
*win10を使用しています。
※参考
https://railsgirls-bne.github.io/sinatra-app-guide
https://github.com/janko/sinatra-activerecord
参考にも載せたこちらの記事が体系的にsinatraのアプリを組むのに、詳しく書かれてるかなと思うので、こちらの記事と見比べながら進めます。
まず、何をしたか
sinatraでWebアプリを組む練習をしていました。
http://recipes.sinatrarb.com/p/databases/postgresql-activerecord?#article
こちらのsinatraのreadmeにも記載されていたり、他の記事にも記載されている通り、Gemファイルを作成し、bundle install -(略)
でGemファイルを作ってDBの設定だ!ってところでRakeファイルを使い、マイグレーションだってところまで出来てました。
具体的に、何をしたか
1.Sinatraアプリのために、任意のフォルダを作ります。
2.Gemファイルを作成します。bundle install
を流します。
3.その他のフォルダ、ファイルを作成します。
4.ymlファイルを作成します。
5.Rakeファイルを作成します。
6.bundle exec rake~
を流します。←ここでcannot load such file -- sinatra/activerecord
のエラーが発生
具体的なコードは、、、
アプリのディレクトリ配下でbundle init
を実行し、Gemファイルを作成します。
#Gemfile
source 'https://rubygems.org'
gem "sinatra"
gem "rake"
gem "sqlite3"
gem "activerecord" #最近のアップデートでActive Record6がインストールされました。
gem "sinatra-activerecord"
これでbundle install
すると、sqlite3、rakeコマンド、Active Recordをsinatraのアプリで使用することが出来ます。
アプリのディレクトリ配下で、config
フォルダを作成します。
config
フォルダ配下に、application.rb
と、database.yml
を作成します。
# require gems and classes
require 'bundler'
Bundler.require
$: << File.expand_path('../', __FILE__)
Dir['./app/**/*.rb'].sort.each { |file| require file }
# configure sinatra
set :root, Dir['./app']
set :public_folder, Proc.new { File.join(root, 'assets') }
set :erb, :layout => :'layouts/application'
sqlite: &sqlite
host: 127.0.0.1
adapter: sqlite3
development:
<<: *sqlite
database: db/development.sqlite3
production:
<<: *sqlite
database: db/production.sqlite3
test:
<<: *sqlite
database: db/test.sqlite3
説明は割愛します。
Rakeファイルの作成とRakeコマンド
そして、アプリのディレクトリ配下で、Rakefile
を作成します。
#Rakefile
require './config/application'
require 'sinatra/activerecord/rake'
この2行でいいみたいなんです!
記事によると、こういう記述の仕方もありました。
#Rakefile
require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'
この状態で、Rakeコマンドが使えるみたいです。
例えば、この状態でbundle exec rake -T
コマンド(Rakeファイルのタスクの確認)を流すと、Rakeファイルに登録されたのタスクが一覧で出るみたいですが、私の場合、cannot load such file -- sinatra/activerecord
のエラーが発生しました。
activerecordにsinatra/activerecord
を呼び出す機能がついてるのか思いきや、そうでもないみたいでした。。。
ReadmeやGitHubで他のコードを見ても、これだけの記述のものが多かったので、自分の設定ミスなのかもしれませんが、動かないものは動かない。
もし、この方法だけで出来た方がいればコメントを頂きたいです。
まとめ
次回は解決後のコードを載せます!