Web Marina

日々の業務や勉強などで得た知識をアウトプットしていきます。

9章のrememberメソッドが動かずハマった。

9章に入ってremember me機能の追加について学んでいますが、なかなか理解が及ばず難航しております。 今回は1.1の演習でだいぶハマったので書き留めておきます。

概要

演習1のrememberメソッドの動作確認を行おうとしたところ、NoMethodErrorが出てしまった。

対処

NoMethodError: undefined method `remember_token' forを調べてみた

そのまんまですが、これでググってみたところ

Undefined method `remember_token=' 'find_by_remember_token' - Chapter 8 Ruby on Rails Tutorial - Stack Overflow

というのが見つかったので$rails db:resetしました。

SQLite3::BusyException: database is locked:

登録したユーザーが消えてしまったので、ブラウザから再登録を試みたところ、今度はこんなのが出てきました。

いろいろ調べてデータベースロックやdatabase.ymlのtimeoutの値を変更するとか、 ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;") をコンソールで実行するとか出てきましたが、私の場合はもう一つのターミナルでコンソールが動いたままだったのが原因のようです。 rails consoleを終了したところ無事ユーザー登録できました。

ちみに他の解決法が書いてあったのはこちらの記事です。

Ruby: SQLite3::BusyException: database is locked: - Stack Overflow

これで無事rememberメソッドが動くようになりました。

おまけ

今回特にテストは追加していなかったので意味はあまりないとは思いましたが、一応やってみたところ何か引っかかってしまいました。

rails aborted!
ActiveRecord::NoEnvironmentInSchemaError:

私はSchemaErrorというところで「なんかDB系がおかしいのか?」と勝手に判断して$rails db:resetとかしましたが、後ほど調べたらRails5から導入された本番環境で間違ってデータベース破壊するような命令しちゃった時の予防策のようです。 こちらで詳しく説明してくださっています。

Rails 5に入ったDB破壊系taskの防止処理について | 日々雑記

そういえばエラーメッセージの最後に「テスト環境で実行しなさいよ」って言われてたかも・・・

当たり前ですが、エラーメッセージはちゃんと読まなきゃダメですね。