rails generateする時sqlite3の指定で躓いた話


環境

  • cloud9
  • Rails 5.2.2

controllerをgenerateしたかった

controlleを作ろうとrails generate。

$ rails generate controller search books

いやー、railsはこれがあるから良いですねー。
昔やってたStrutsなんて用意するファイルを全部手で作ってたから効率がぜんぜん違うわー。
さてさて、ズラズラっと出てきたから出来てー…

/usr/local/rvm/rubies/ruby-2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.16.5/lib/bundler/rubygems_integration.rb:408:in `block (2 levels) in replace_gem': Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? can't activate sqlite3 (~> 1.3.6), already activated sqlite3-1.4.0. Make sure all dependencies are added to Gemfile. (LoadError)
  :
 (以下スタックトレース)
  :

ないじゃん。
おもくそエラーじゃん。

答えはエラーに書いてある

ちゃんとしたフレームワークならちゃんとしたエラー文が出力されるので、まずはエラー文を眺めてみましょう。
すると、最後にこんな記載があるわけですな。

Make sure all dependencies are added to Gemfile.

英語が得意とは言えない人(=ぼく)でも「dependencies」を「Gemfile」でなんかしなきゃいけないことはなんとなーくわかりますね。
じゃあその直前に何が書いてあるかというと、

Missing a gem it depends on? can't activate sqlite3 (~> 1.3.6), already activated sqlite3-1.4.0.

ざっくり和訳すると、「Genfileのsqlite3周りちゃんと見ろ」
わざわざバージョン指定まで入ってるので、Gemfileにコピペしときましょう。
現在のsqlite3をコメントアウトして、その下にコピってペーします。

gemfile
# Use sqlite3 as the database for Active Record
# gem 'sqlite3'
gem 'sqlite3', '~> 1.3.6'

保存したのを確認して、rails generateを再実行。

$ rails generate controller search books
Running via Spring preloader in process 12947
      create  app/controllers/search_controller.rb
       route  get 'search/books'
      invoke  erb
      create    app/views/search
      create    app/views/search/books.html.erb
      invoke  test_unit
      create    test/controllers/search_controller_test.rb
      invoke  helper
      create    app/helpers/search_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/search.coffee
      invoke    scss

今度はちゃんと動きました。めでたしめでたし。

参考資料

railsでおこったエラーについて