1.やりたかったこと
gem deviseを利用してユーザー登録(名称はownerとしている)機能を実装済。
パスワードの入力なしに、登録されたデータを編集しようとするもエラーが起き、その解決に無駄にだいぶ悩んでしまった話。
2.実行環境
Ruby 2.6.5
Rails 6.0.3
3.前提としてできていた準備
devise側の仕様に沿って以下の二つの準備が必要でした。
①account_update時にデフォルトカラム以外のカラムの値を許容する(sanitizer)
②passwordなしでのアップデートを許容する。
公式のこちらとかこちらの記事を見ればできるかと思います。Qiitaも調べればいっぱいあるはずです。
これらは出来ていたのに以下の様になぜかうまくアップデート保存ができず、deviseの仕様のせいか・・・?と悶々と悩むはめに。
上のエラー検証をしていて僕は以下の様に悩んでいたのでした。
1.ArgumentError given 0〜となっているので、そもそもうまいこと引数が渡されていないのでは?(でもparamsはちゃんと通っている・・・)
2.エラーメッセージがパスワードということは、やはりdeviseのパスワードなし更新がうまくいっていないのでは?
4.結論
パスワードのバリデーションがひっかかってる故のエラーでした。
class Owner < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :name, presence: true
validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX}
validates :password, presence: true, confirmation: true, length: { minimum: 7 }
has_many :shops
end
上記モデルのバリデーションがupdate時にもかかっており、それでエラーがでていた形です。
よく考えればバリデーションに設定したエラーメッセージが出力されてるんだから当たり前ですよね、そもそも。
なので
class Owner < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :name, presence: true
validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX}
validates :password, presence: true, confirmation: true, length: { minimum: 7 },on: :create
has_many :shops
end
こんな感じでパスワードのバリデーションをcreate時のみの設定にしてあげれば解決しました。
5.泥沼にはまったミス
先ほどのbinding.pry時のエラーメッセージについて、僕はここで引数がうまくわたっていないと思いこんでいたのですが、その認識がそもそも誤っておりまして。
controllerのupdateアクションでちゃんと引数が渡った後に、デバッグ画面でもう一回updateを実行しているんですよね、これだと。
なので僕がこの画面上でうったupdateには引数が指定されていないので、そりゃ引数ないよというエラーが起きているだけなのです。
この流れをちゃんと理解できていいないからこそはまったミスでした・・・反省。