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

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

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

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

Ruby on Rails

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

Q&A

1回答

4118閲覧

passwordの更新をしていないのに、validationが

kobakatsuki

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/14 00:32

編集2020/05/14 00:35

前提・実現したいこと

railsでsnsサイトを作っています。
プロフィール画像の更新の際に疑問点があったので、ご教授ください。

発生している問題・エラーメッセージ

プロフィール画像の更新をする際、images controllerにて、strong parametersを用い、
userモデルのimage_userを更新します。
その際に、strong parametersにてpasswordを受け取っていないのに、下記エラーメッセージがでます。

エラーに従い、userモデルにてpasswordにallow_nilを記載することでエラーは解消されたのですが、
なぜ、passwordに対して、validationがかけられたのかご教授願います。

*** ActiveRecord::RecordInvalid Exception: Validation failed: Password can't be blank, Password is too short (minimum is 8 characters)

該当のソースコード

imagesController

1class ImagesController < ApplicationController 2 before_action :logged_in_user, only: :update_user 3 before_action :correct_user, only: :update_user 4 5 def edit_user 6 @user = User.find(params[:id]) 7 end 8 9 def update_user 10 @user = User.find(params[:id]) 11 debugger 12 if @user.update(user_params) 13 flash[:success] = "画像を更新しました" 14 redirect_to user_path(@user) 15 else 16 flash[:danger] = "画像を更新できませんでした" 17 render 'users/show' 18 end 19 end 20 21 private 22 23 def user_params 24 params.require(:image).permit(:image_user) 25 end 26 27end 28

userModel

1class User < ApplicationRecord 2 has_many :microposts 3 4 validates :name, presence: true, length:{maximum:10} 5 validates :email, presence: true, uniqueness: true 6 7 has_secure_password 8 validates :password, presence: true, length:{minimum:8}, allow_nil: true 9 validates :introduction, length:{maximum:160} 10 11 mount_uploader :image_user, UserImageUploader 12 13 #パスワードのハッシュ化 14 def User.digest(password) 15 BCrypt::Password.create(password) 16 end 17 18end 19

試したこと

user.rbにて、has_secure_passwordをコメントアウトし、passwordをpassword_diestに変更すると、エラーがでなくなりました。てことは、passwordという仮想的な物に対する仕様なのかなぁとか思ってます。

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

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

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

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

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

guest

回答1

0

passwordという仮想的な物に対する仕様なのかなぁとか思ってます。

has_secure_passwordは、パスワードとして空文字列が来た場合に、「無視してパスワードの変更を行わない」という仕様が組み込んであります。一方で、nilを入れると、パスワードをクリアするという動作になります。

Ruby on Rails の has_secure_password のコードを読んでみる

validates :password, presence: true, length:{minimum:8}, allow_nil: trueは、これら前提と全く矛盾するバリデーションです。

投稿2020/05/14 00:37

maisumakun

総合スコア146018

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

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

kobakatsuki

2020/05/14 03:29

ご回答ありがとうございます。 今回は、imageのみの更新のため、passwordのvalidationは走らない認識だったのですが、has_secure_passwordのpasswordに関しては、validationが走ってしまうのでしょうか? また、エラー内容が、"password can't be blank"となっているため、パスワードは空文字列になってて、ならばパスワードの変更を行わないでエラーでないのかなと思ってるのですが、どうなんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問