【Rails】ActiveModel::UnknownAttributeError: unknown attribute ‘password’ for User.

【Rails】ActiveModel::UnknownAttributeError: unknown attribute ‘password’ for User.

コジマです。

また、しょぼい理由でハマってしまいました。。

Railsチュートリアルの第6章を勉強していて、
リスト6.39のこれ

require 'test_helper'

class UserTest < ActiveSupport::TestCase

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

これをテストしたら

$ rails test
Running via Spring preloader in process 9083
Run options: --seed 28936

# Running:

..EEEEEEE.....

Finished in 0.671107s, 20.8611 runs/s, 25.3313 assertions/s.

  1) Error:
UserTest#test_email_addresses_should_be_unique:
ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
    test/models/user_test.rb:6:in `setup'

  2) Error:
UserTest#test_email_should_not_be_too_long:
ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
    test/models/user_test.rb:6:in `setup'

  3) Error:
UserTest#test_email_validation_should_accept_valid_addresses:
ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
    test/models/user_test.rb:6:in `setup'

  4) Error:
UserTest#test_should_be_valid:
ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
    test/models/user_test.rb:6:in `setup'

  5) Error:
UserTest#test_email_should_be_present:
ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
    test/models/user_test.rb:6:in `setup'

  6) Error:
UserTest#test_email_validation_should_reject_invalid_addresses:
ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
    test/models/user_test.rb:6:in `setup'

  7) Error:
UserTest#test_name_should_not_be_too_long:
ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
    test/models/user_test.rb:6:in `setup'

14 runs, 17 assertions, 0 failures, 7 errors, 0 skips

えぇぇぇぇえぇ。。。
エラーじゃん…。

UnknownAttributeErrorってことは知らん属性がいるぞ、と。
passwordってやつを知らんらしい。

トラブルシューティングや…。

$ bundle list | grep bcrypt
  * bcrypt (3.1.11)

bcryptはインストールされている。

bcrypt入れる前のファイルに戻してみるか…。

class User < ApplicationRecord
  before_save { self.email = email.downcase }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  #has_secure_password
end
  def setup
    #@user = User.new(name: "Example User", email: "user@example.com",
    #                 password_digest: "foobar", password_confirmation: "foobar")
    @user = User.new(name: "Example User", email: "user@example.com")
  end

テストが通る。。。

$ rails test
Running via Spring preloader in process 11074
Run options: --seed 21380

# Running:

..............

Finished in 0.689584s, 20.3021 runs/s, 46.4048 assertions/s.

14 runs, 32 assertions, 0 failures, 0 errors, 0 skips

もう一度リスト6.37の状態にして。。

class User < ApplicationRecord
  before_save { self.email = email.downcase }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  has_secure_password
end

これはREDだから。。

$ rails test
Running via Spring preloader in process 11074
Run options: --seed 21380

# Running:

..............

Finished in 0.689584s, 20.3021 runs/s, 46.4048 assertions/s.

14 runs, 32 assertions, 0 failures, 0 errors, 0 skips

あれ????
testが通る…なぜだ…。
この時点でなにかおかしいということになりますな。。。

modelのuser.rbを呼び直してみる

class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
     format: { with: VALID_EMAIL_REGEX },
     uniqueness: { case_sensitive: false }
end

あれ、has_secure_passwordがない。

ちゃんと修正が反映されてなかっただけみたい(泣)

その後問題が解決しました…。

予期せぬ動きをしたら、ファイルの修正が反映されているか確かめる癖つけなきゃダメですね。。

もっと実りあるいい記事を書きたかったのですが、こんなしょぼいことで申し訳ないです。。
無駄に時間使ってしまった。。。

先に進まないとぉぉぉ。。

以上です。コジマでした。


Ruby on Railsカテゴリの最新記事