💎

【Rails】ActiveModel::UnknownAttributeError

2024/04/09に公開

はじめに

Railsチュートリアル(第7版)
「6.3〜6.4 パスワードとハッシュ化、デプロイ用スクリプトの導入」を進めている際に遭遇したエラーをメモ書きで共有

※ Railsチュートリアル(第7版)動画解説を一部引用
https://railstutorial.jp/webtext#sec-creating_and_authenticating_a_user

エラーが出るまでの経緯

rails c --sandboxを開き以下を入力

irb(main):001> User.create(name: "John Smith", email: "john@example.com", password: "foobar", passwordconfirmation: "foobar")

エラーメッセージ

  TRANSACTION (0.0ms)  begin transaction
/usr/local/rvm/gems/default/gems/activemodel-7.0.4.3/lib/active_model/attribute_assignment.rb:51:in `_assign_attribute': unknown attribute 'passwordconfirmation' for User. (ActiveModel::UnknownAttributeError)

          raise UnknownAttributeError.new(self, k.to_s)

要点

ActiveModel::UnknownAttributeError

エラー内容

「Userモデルにpasswordconfirmationという属性が存在しないために発生していますよ」というエラー

原因

タイポ

test/models/user_test.rb

 def setup
    @user = User.new(name: "Example User", email: "user@example.com",
                     password: "foobar", password_confirmation: "foobar")
  end

上記を参考に修正

before

passwordconfirmation

after

password_confirmation

再度確認

User作成に成功

irb(main):002> User.create(name: "John Smith", email: "john@example.com", password: "foobar", password_confirmation: "foob
ar")
  TRANSACTION (0.1ms)  SAVEPOINT active_record_1
  User Exists? (4.0ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "john@example.com"], ["LIMIT", 1]]
  User Create (0.5ms)  INSERT INTO "users" ("name", "email", "created_at", "updated_at", "password_digest") VALUES (?, ?, ?, ?, ?)  [["name", "John Smith"], ["email", "john@example.com"], ["created_at", "2024-04-09 01:02:15.297182"], ["updated_at", "2024-04-09 01:02:15.297182"], ["password_digest", "[FILTERED]"]]
  TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1

password_digest"[FILTERED]"がカバーされている点も確認

=> 
#<User:0x00007f728c7d5658
 id: 1,
 name: "John Smith",
 email: "john@example.com",
 created_at: Tue, 09 Apr 2024 01:02:15.297182000 UTC +00:00,
 updated_at: Tue, 09 Apr 2024 01:02:15.297182000 UTC +00:00,
 password_digest: "[FILTERED]">

その他の要点

「パスワードはデータベースに平文で保存されない、ハッシュ値で保存される🔑」

以下スライド大変わかりやすく印象に残りました📚
先ほど作成した

※ Railsチュートリアル(第7版)動画解説を一部引用

参考

Railsチュートリアル(第7版)
https://railstutorial.jp/webtext#sec-creating_and_authenticating_a_user

エラー文で検索してヒット
https://api.rubyonrails.org/classes/ActiveModel/UnknownAttributeError.html

Discussion