🙌

NoMethodError: undefined method `password_digest='

2023/05/06に公開

RailsTutorial6章で発生したエラーの自分用メモを再編集しています。
誰かの参考になるかどうか気にしていません。

has_secure_passwordを追加後password_digestがNomethoderror

NoMethodError: undefined method `password_digest=' for #<User:0x0000XXXXXXXXXXXX>
Did you mean?  password=
 test/models/user_test.rb:6:in `setup'

password_digestは定義されていません。もしかしてpasswordのこと?
と言われたけどuser_test.rbにpassword_digestの記載はなく、passwordとpassword_confirmationのみ

1周目では起こらなかったエラー
あとあとpassword_digestを実装するときに消えるとは思うけど

https://qiita.com/amaranthine/items/6ae2ea37573c3c376aed
テスト用のDBと開発用のDBが違うことにより起きている

$ rake db:test:prepare
/home/ubuntu/.rvm/gems/ruby-2.6.3/gems/pry-byebug-3.8.0/lib/pry-byebug/control_d_handler.rb:5: warning: control_d_handler's arity of 2 parameters was deprecated (eval_string, pry_instance). Now it gets passed just 1 parameter (pry_instance)
warning ../../package.json: No license field

この後テストしてもエラーが起きて解決せず

has_secure_passwordを消してテスト

ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.               test/models/user_test.rb:6:in `setup'

教材戻ってpassword_digestカラムを追加するマイグレーションファイルを確認
再度 $ rails db:migrate

bcryptにスペルミスがないかgemfileを確認
$ bundle install
testするもhas_secure_password後と同じエラー

development.sqlite3をDB Browser for SQliteで確認したところ
usersテーブルにはpassword関連のカラムはなかった

rails generate migration…をコピペしたところ既に同じ名前のファイルがあるとのこと
コマンドラインでのスペルミスではなかった

migrationファイルを眺めていたら
def changeのはずがdef achangeとなっていた
おそらく最初にmigrationファイルを作成後に確認した際に打ち込んでしまい
気付かず上書きしていたよう

修正後また$ rails db:migrateしてDB Browserで確認するも変わらず

rails generate migration…をコピペでやり直すも上書き出来ないため
一度既存のファイルを消して新規作成

$ rails db:migrate
>> (省略)add_column(:users, :password_digest, :string)
   -> 0.0034s
== 20220722071451 AddPasswordDigestToUsers: migrated (0.0045s) =

追加された!DB Browserでも確認とれた
テストもパスした!
migrationファイルをミスってた場合は作り直した方が良いのかも

Discussion