IT

devise encrypted_passwordカラムについて

この投稿では、ruby on railsのdeivse gemに関して、encrypted_passwordカラムを中心にまとめます。
テストには、rspec gemを利用しています。

encrypted_passwordカラムとは

  • devise gemを用いる時に、デフォルトで生成されるカラム
  • 認証機能を実現するために用いる、暗号化されたパスワードを保存するためのカラム
    • 暗号化に関しては、こちらが参考になります

encrypted_passwordカラムの特徴①

「password_confirm」はなくても、encrypted_passwordカラムに保存できる

デフォルトのユーザ登録ページでは、パスワードを2回入力させ、「password」、「password_confirm」キーでコントローラーに送ります。

しかし、実は「password」のみで、encrypted_passwordカラムにパスワードを保存することができます。
また、passwordから名前を変更してしまうと、保存ができなくなってしまいます。

詳しくは、以下の画面キャプチャとコード、paramsを参照してください!

passwordとpassword_confirmでパスワードを保存しようとした場合

スクリーンショット 2020-08-20 16.24.32.png
スクリーンショット 2020-08-20 16.24.57.png
<%= f.password_field :password, autocomplete: "new-password" %>
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
Parameters: {"authenticity_token"=>"2kwMkYb/FLWsQ5ocjDKh7CoAJQspw4a7GxYzned9UIS3+2h+IHBVUOATnzA7WaCChJJ11Hx8hCjGiE+nFu7ayg==", 
"user"=>{"email"=>"a@a", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}

passwordのみでパスワードを保存しようとした場合

スクリーンショット 2020-08-20 16.28.29.png
スクリーンショット 2020-08-20 16.28.49.png
<%= f.password_field :password, autocomplete: "new-password" %>
 Parameters: {"authenticity_token"=>"18JZrq8OT4KEPTkf2XVc43YQknUOquOjB2yWX/hM28BTTVX9G6IALwMEiO3L1DFLykkIAN+uhBVjYYatdWSGOw==",
 "user"=>{"email"=>"b@b", "password"=>"[FILTERED]"}, "commit"=>"Sign up"}

password→passwordsとし、パスワードを保存しようとした場合

スクリーンショット 2020-08-20 16.50.52.png
<%= f.password_field :passwords, autocomplete: "new-password" %>
Parameters: {"authenticity_token"=>"exjpDE+dfGvaQUGrnf67GGgJBWgv9k8jCo37V+yZvLzXtDya9Kw+E9glcseQ5OSz2QQda/OWc6pv/XsKGzJ5mA==", 
"user"=>{"email"=>"c@c", "passwords"=>"[FILTERED]"}, "commit"=>"Sign up"}

encrypted_passwordカラムの特徴②

ユーザ登録機能をテスト時、encrypted_passwordカラムの名前を変更すると、
エラーが発生する

まずは正常にテストが通る例からです。

RSpec.describe User, type: :model do
  describe 'ユーザー作成' do
    it 'passwordキーにて保存' do
      user = User.new(password: '111111',email: 'a@a')
      expect(user.valid?).to eq true
    end
  end
end

カラム名をpasswordに変更すると、以下のようなエラーになります。

NoMethodError:
       undefined method `encrypted_password=' for #<User:0x00007fe8822ccfc8>

encrypted_passwordは、Webアプリケーション内のどのファイルにも記載がありません(呼び出していない)が、エラーになってしまいます。
この場合は、マイグレーションファイルにてカラム名を「encrypted_password」に変更し、マイグレーションしましょう。

補足

「encrypted_passwordカラムに保存するには、passwordキーと、そのバリューが必要」
のテストはこんな感じになります。

 Failure/Error: user = User.new(passwords: '111111',email: 'a@a')

     ActiveModel::UnknownAttributeError:
       unknown attribute 'passwords' for User.
     Failure/Error: expect(user.valid?).to eq true

       expected: true
            got: false

  

おわりに

ここまで読んでいただき、ありがとうございます。
質問や不備修正依頼は、コメントでお願いします。

また、ITが好きな方にもレイキに興味を持っていただきたく、ブログ内に記事を投稿しています。
併せて読んでいただけますと幸いです。

友だち追加
レイキ・ファーストディグリー修得レイキ、ファーストディグリーのアーチュメントを受けてみての感覚を残します。...

ABOUT ME
IPPEI
システムエンジニア→プログラミング教育講師(マネージャー)→システムエンジニア兼レイキヒーラー 私のITが好きな思いや、楽しんでいる様子を記事を通して伝えられたな〜と思ってITの記事を書いています。 また、体でレイキをわかっていただくきっかけになれることを夢みてレイキの記事を書いています。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA