質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

921閲覧

レコードを更新しようとするとバリデーションで引っかかってしまう

kdh

総合スコア26

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/10/08 03:56

編集2020/10/08 06:07

ユーザーのexpというカラムを更新する瞬間なぜかパスワードのバリデーションで引っかかってしまい更新できません。試しにバリデーションを外したら、更新できました。パスワードのバリデーションを外すのは本意ではないので他に何かやり方があるでしょうか?

バリデーションの記述

class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :tasks validates :name, :email, presence: true validates :name, length: { maximum: 6 } validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{6,100}\z/i} end

更新をする際の記述

def update @task = Task.find(params[:id]) # タスクのポイントを確定 @task.update(task_params) # userを確定 @user = current_user @level = Level.find_by(number: @user.player_level + 1) # userの今の経験値が入る @tmp_exp = @user.exp # 今現在の経験値 + 今回の経験値 @total_exp = @tmp_exp + @task.point_id # ユーザーのトータル経験値を保存 @user.update(exp: @total_exp) binding.pry # レベルアップ処理 if @level.threshold <= current_user.exp @user.player_level += 1 @user.save end redirect_to root_path end

binding.pryで止めた時のエラーメッセージ

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/10/08 04:13

パスワード列はどのような方法で保管していますか?
kdh

2020/10/08 05:28

パスワード列の保管ですか?保管とはどういった意味でしょうか?
kdh

2020/10/08 05:38

googleのパスワードを保存しますか?のポップアップのことでしょうか?
maisumakun

2020/10/08 05:50

> 保管とはどういった意味でしょうか? 単にデータベースにpassword列があるのか、それともhas_secure_passwordなど特殊な仕掛けを使っているのか、という意味です。
kdh

2020/10/08 05:59 編集

それですとデーターベースの方に保管します。データベースはmysqlです
maisumakun

2020/10/08 06:04

Userモデル全体を出していただけませんか?
kdh

2020/10/08 06:08

上記のバリデーションのところを編集し直しました。全体のものになります。
guest

回答1

0

ベストアンサー

validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{6,100}\z/i}, allow_blank: trueとして、何も入っていない時のバリデーションを外してください。

データベースに保存する時点で、パスワードはハッシュ化され戻せません。なので、データベースから引いてきたUserモデルは、パスワード欄がnilのままになっています。その場合だけバリデーションを無視させましょう。

(なお、空のパスワードを設定するという事態は、正しく設定すればdevise側が防ぐので気にしなくてかまいません)

投稿2020/10/08 06:17

編集2020/10/08 06:18
maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kdh

2020/10/08 06:26

ありがとうございます。解決しました。 allow_blank: trueについて自分でも調べて知識を深めたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問