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

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

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

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

Ruby on Rails

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

Q&A

1回答

2508閲覧

Rails パスワードを変更せず更新したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/02/01 08:35

編集2020/06/05 14:11

Ruby on Railsを利用して、プロフィールの編集画面を作っています。
画像(image)、名前(name)、ひとこと(comment)、パスワード(password)を変更できる機能を作っています。

パスワード変更せずに更新しようとすると
Password can't be blank, Password is too short
と出てきます。
パスワードを変更しなくても更新できるようにしたいです。

以下、問題がありそうなコードです。
分かりづらい部分もあると思いますが、よろしくお願い致します。

users_controller.rb

def edit @user = User.find(current_user.id) end def update @user = User.find(current_user.id) upload_file = params[:user][:image] #画像のみ更新可能 if upload_file.present? upload_file_name = upload_file.original_filename output_dir = Rails.root.join('public', 'users') output_path = output_dir + upload_file_name File.open(output_path, 'w+b') do |f| f.write(upload_file.read) end @user.name = params[:name] @user.comment = params[:comment] @user.password = params[:password] current_user.update(user_params.merge({image: upload_file.original_filename})) end if @user.save flash[:success] = 'プロフィールを更新しました。' redirect_to("/") else flash.now[:danger] = 'プロフィールの更新に失敗しました。' render :edit end end private def user_params params.require(:user).permit(:name, :email, :password, :comment, :image) end end

edit.html.erb

<div class="container"> <ul class="profiles"> <%= form_for @user, url: edit_path, method: :post do |f| %> <div class="field"> <%= f.label :image, "画像" %> <%= f.file_field :image %> </div> <div class="field"> <%= f.label :name, "名前" %> <%= f.text_field :name, placeholder: "名前を入力して下さい。" %> </div> <div class="field"> <%= f.label :comment, "ひとこと" %> <%= f.text_field :comment, placeholder: "自己紹介" %> </div> <div class="field"> <%= f.label :password, "パスワード" %> <%= f.text_field :password, placeholder: "パスワードを更新しない場合は入力しないで下さい。" %> </div> <div class="field"> <%= f.label :password_confirmation, "パスワード(確認)" %> <%= f.password_field :password_confirmation, placeholder: "確認用" %> </div> <div class="button_wrap"> <input type="submit" value="送信する" class="button"> </div> <% end %>  </ul> </div>

routes.rb

get '/users/profiles/edit', to: 'users#edit',as: :edit post '/users/profiles/edit', to: 'users#update', as: :update

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

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

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

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

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

guest

回答1

0

validationで引っかかっているように思えます。

  1. Userのvalidationのところを載せていただけますか。
  2. flash.now[:danger] = 'プロフィールの更新に失敗しました。'

でなく
flash.now[:danger] = @user.errors.full_messages.join
とするとはっきりします。

3)確認しておいたいことがあります。
編集画面は編集前の値が入っていると思いますが、
「のみの変更」の場合、以外の項目を空にするわけではないですよね?

  1. 仮説があるのですが、パスワード絡みで仮説では説明しきれないところがあるので、「名前のみ、ひとことのみ、パスワードのみの変更」でのerrors.full_messages を確認させていただきたいです。

仮説
名前のみの変更の場合、パスワード欄が空のため、パスワード必須のvalidation に引っかかる
パスワードの変更が駄目なのはここに問題がある
<%= f.text_field :password, placeholder: "パスワードを更新しない場合は入力しないで下さい。" %> <%= f.password_field :password, placeholder: "確認用" %>
両方 :password になっていて、 確認用field名になっていません。
ので、passwordと確認用が一致せず変更失敗

説明しきれない所
全部変更なら通るとすると passwordと確認用が一致 しなくてもよさ気で、となるとパスワードのみ変更が通らないのが不思議

投稿2020/02/01 12:09

winterboum

総合スコア23329

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

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

退会済みユーザー

退会済みユーザー

2020/02/04 09:22

ご回答ありがとうございます。 1) Userのvalidationのところを載せていただけますか。 user.rb class User < ApplicationRecord before_create :convert_password def convert_password self.password = User.generate_password(self.password) end def self.generate_password(password) salt = "h!hgamcRAdh38bajhvgai17ysvb" Digest::MD5.hexdigest(salt + password) end VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i validates :name, presence: true validates :email, presence: true, format: {with: VALID_EMAIL_REGEX} ,uniqueness: true validates :password, presence: true, length:{minimum: 8} end 以上になります。 3)確認しておいたいことがあります。 編集画面は編集前の値が入っていると思いますが、 「のみの変更」の場合、以外の項目を空にするわけではないですよね? →空にする訳ではなく、編集しない項目は編集前の値と同じにしたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問