Posted at

devise_token_authでundefined method allow_password_changeがでた

web側がdeviseで動いていたアプリにdevise_token_authを追加して、devise_token_authのAPIでパスワードの更新処理を行うときに、undefined method allow_password_changeエラーが発生した時の対処とその流れをザックリ書きます。

パスワード変更処理は、DeviseTokenAuth::PasswordsController#updateおよびこれを継承した独自のクラス内で行われているはずです。

まずは、DeviseTokenAuth::PasswordsControllerupdateメソッド内を参照します。この箇所allow_password_changeメソッドを読んでいるようです。

@resource.allow_password_change = false if recoverable_enabled?

recoverable_enabled?これは、deviseモデルのrecoverableモジュール関係ですかね?確かにユーザーモデルで宣言してるdeviseのDSLをみてみると、recoverableを宣言してます。n

devise_token_authの方でdeviseにない何かやってるのかな?と推測。

多分エラー文でググったらこのissue #1136が出てくると思います。

このissueの投稿者のコメントに注目 :eyes:

コメントの通り、#863のPRに関係があるみたいなので、PRを見てみます。

そこに、#481に対しての修正であることが書かれてますね。

このissueは、またがったリクエストでallow_password_changeが永続化されないことについてのissueであると・・・つまり#863のPRではこれを永続化したわけですね。PRの説明文をさらっと読んで、Files changedをみて見ると、この行で確かにカラムを追加してました。

というわけで、devise_token_authの変更に従って、アプリの方でもカラムを追加してあげます。

add_column :users, :allow_password_change, :boolean, default: false