1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】updateアクションが通らない理由を間違って検証し続けた話(update)

Posted at

1.やりたかったこと

gem deviseを利用してユーザー登録(名称はownerとしている)機能を実装済。
パスワードの入力なしに、登録されたデータを編集しようとするもエラーが起き、その解決に無駄にだいぶ悩んでしまった話。

2.実行環境

Ruby 2.6.5
Rails 6.0.3

3.前提としてできていた準備

devise側の仕様に沿って以下の二つの準備が必要でした。
①account_update時にデフォルトカラム以外のカラムの値を許容する(sanitizer)
②passwordなしでのアップデートを許容する。

公式のこちらとかこちらの記事を見ればできるかと思います。Qiitaも調べればいっぱいあるはずです。

これらは出来ていたのに以下の様になぜかうまくアップデート保存ができず、deviseの仕様のせいか・・・?と悶々と悩むはめに。

スクリーンショット 2020-09-02 12.00.22.png

上のエラー検証をしていて僕は以下の様に悩んでいたのでした。

1.ArgumentError given 0〜となっているので、そもそもうまいこと引数が渡されていないのでは?(でもparamsはちゃんと通っている・・・)
2.エラーメッセージがパスワードということは、やはりdeviseのパスワードなし更新がうまくいっていないのでは?

4.結論

パスワードのバリデーションがひっかかってる故のエラーでした。

owner.rb
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時にもかかっており、それでエラーがでていた形です。
よく考えればバリデーションに設定したエラーメッセージが出力されてるんだから当たり前ですよね、そもそも。

なので

owner.rb
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.泥沼にはまったミス

スクリーンショット 2020-09-02 14.49.05.png

先ほどのbinding.pry時のエラーメッセージについて、僕はここで引数がうまくわたっていないと思いこんでいたのですが、その認識がそもそも誤っておりまして。

controllerのupdateアクションでちゃんと引数が渡った後に、デバッグ画面でもう一回updateを実行しているんですよね、これだと。
なので僕がこの画面上でうったupdateには引数が指定されていないので、そりゃ引数ないよというエラーが起きているだけなのです。

この流れをちゃんと理解できていいないからこそはまったミスでした・・・反省。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?