NoMethodError: undefined method `password_digest='
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を実装するときに消えるとは思うけど
テスト用の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