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

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

ただいまの
回答率

88.09%

deviseの情報編集時にpasswordの変更更新ができない!!! "password"=>"[FILTERED]"となってしまう。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 258

score 2

解決したいこと

deviseの情報編集時にpasswordも含め全て更新できるようにしたい!

起っていること

Processing by Devise::RegistrationsController#update as HTML
  Parameters: {"authenticity_token"=>"pIrLVpiSyUzL85deQhLPrv/qD2Iig5XspxlIQBccx1zD9GrdMhRzxtgBxVpY9w5XpbJ0e0C5WeK0uuZEQibBQw==", "user"=>{"nickname"=>"テスラ", "email"=>"te@te", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "birthday(1i)"=>"1980", "birthday(2i)"=>"9", "birthday(3i)"=>"19", "gender_id"=>"2", "form_id"=>"2", "profession_name"=>"トレーナー", "want_to_do"=>"自分のジムを立ち上げたい\r\nSNSで拡散したいため、カメラマンに撮影して欲しい", "can_do_list"=>"姿勢改善、筋肉増量のためのトレーニング、食事指導"}, "commit"=>"変更する"}
  User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
  Rendering devise/registrations/edit.html.erb within layouts/application
  Rendered shared/_second-header.html.erb (Duration: 0.8ms | Allocations: 662)
  Rendered shared/_error_messages.html.erb (Duration: 0.3ms | Allocations: 156)
  Rendered shared/_second-footer.html.erb (Duration: 0.2ms | Allocations: 292)
  Rendered /Users/niimurakenta/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/devise-4.7.3/app/views/devise/shared/_links.html.erb (Duration: 0.2ms | Allocations: 78)
  Rendered devise/registrations/edit.html.erb within layouts/application (Duration: 3.8ms | Allocations: 4633)
[Webpacker] Everything's up-to-date. Nothing to do
Completed 200 OK in 583ms (Views: 19.2ms | ActiveRecord: 

イメージ説明

実際のコード

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private


  def configure_permitted_parameters

    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :birthday, :gender_id, :form_id, :profession_name, :want_to_do, :can_do_list])
    devise_parameter_sanitizer.permit(:account_update, keys: [:password, :nickname, :birthday, :gender_id, :form_id, :profession_name, :want_to_do, :can_do_list])

  end
end
class UsersController < ApplicationController
  before_action :authenticate_user!, except: [:index, :show]
  before_action :user_params_id, except: [:index,:new, :create]

  def index
    @users = User.all
    @users = User.search(params[:search])

  end


  def show
    @user=User.find(params[:id])
    @currentUserEntry=Entry.where(user_id: current_user.id)
    @userEntry=Entry.where(user_id: @user.id)
    if @user.id == current_user.id
    else
      @currentUserEntry.each do |cu|
        @userEntry.each do |u|
          if cu.room_id == u.room_id then
            @isRoom = true
            @roomId = cu.room_id
          end
        end
      end
      if @isRoom
      else
        @room = Room.new
        @entry = Entry.new
      end
    end
  end
  private


  def puser_params
    params.require(:user).permit(:nickname,:birthday,:gender_id, :form_id, :profession_name, :want_to_do, :can_do_list, :image)
  end 

  def user_params_id
    @users = User.find(params[:id])
  end
end
<%= render "shared/second-header"%>


<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
  <div class='form-wrap'>
    <div class='form-header'>
      <h1 class='form-header-text'>
        会員情報入力
      </h1>
    </div>

    <%= render 'shared/error_messages', model: f.object %>

    <div class="form-group">
      <div class='form-text-wrap'>
        <label class="form-text">ニックネーム</label>
        <span class="indispensable">必須</span>
      </div>
      <%= f.text_area :nickname, class:"input-default", id:"nickname", placeholder:"例) UNION太郎" %>
    </div>
    <div class="form-group">
      <div class='form-text-wrap'>
        <label class="form-text">メールアドレス</label>
        <span class="indispensable">必須</span>
      </div>
      <%= f.email_field :email, class:"input-default", id:"email", placeholder:"PC・携帯どちらでも可", autofocus: true %>
    </div>
    <div class="form-group">
      <div class='form-text-wrap'>
        <label class="form-text">パスワード</label>
        <span class="indispensable">必須</span>
      </div>
      <%= f.password_field :password, autocomplete: "current-password", class:"input-default", id:"password", placeholder:"6文字以上の半角英数字" %>
      <p class='info-text'>※英字と数字の両方を含めて設定してください</p>
    </div>
    <div class="form-group">
      <div class='form-text-wrap'>
        <label class="form-text">パスワード(確認)</label>
        <span class="indispensable">必須</span>
      </div>
      <%= f.password_field :password_confirmation,class:"input-default", id:"password-confirmation", placeholder:"同じパスワードを入力して下さい" %>
    </div>
    <div class="form-group">
      <div class='form-text-wrap'>
        <label class="form-text">生年月日</label>
        <span class="indispensable">必須</span>
      </div>
      <div class='input-birth-wrap'>
        <%= raw sprintf(
                    f.date_select(
                      :birthday,
                      class:'select-birth',
                      id:"birth-date",
                      use_month_numbers: true,
                      prompt:'--',
                      start_year: 1930,
                      end_year: (Time.now.year - 5),
                      date_separator: '%s'),
                    "<p> 年 </p>", "<p> 月 </p>") + "<p> 日 </p>" %>
      </div>
    </div>








    <%# /出品画像 %>
       <%# 商品名と商品説明 %>
    <div class="new-items">
      <%= @user.nickname %>
      <div class="weight-bold-text">
        性別
        <span class="indispensable">必須</span>
      </div>
      <%= f.collection_select(:gender_id, Gender.all, :id, :name, {}, {class:"select-box", id:"item-category"}) %>


      <div class="weight-bold-text">
        所属
        <span class="indispensable">必須</span>
      </div>
      <%= f.collection_select(:form_id, Form.all, :id, :name, {}, {class:"select-box", id:"item-category"}) %>





      <div class="weight-bold-text">
        職業
        <span class="indispensable">必須</span>
      </div>
      <%= f.text_area :profession_name, class:"items-text", id:"item-name", placeholder:"職業(必須 40文字まで)", maxlength:"40" %>
      <div class="items-explain">
        <div class="weight-bold-text">
          叶えたいこと、やりたいこと
          <span class="indispensable">必須</span>
        </div>
        <%= f.text_area :want_to_do, class:"items-text", id:"item-info", placeholder:"叶えたいこと、やりたいことの説明(必須 1,000文字まで)(SNSでの集客、ホームページを作って欲しいなど)例)2010年頃に栃木でパーソナルジムをオープンしました。それに伴いSNSで集客を行いたいのでカメラマンの方を探しています。" ,rows:"7" ,maxlength:"1000" %>
      </div>
      <div class="items-explain">
        <div class="weight-bold-text">
          できることの説明
          <span class="indispensable">必須</span>
        </div>
        <%= f.text_area :can_do_list, class:"items-text", id:"item-info", placeholder:"できることの説明(必須 1,000文字まで)(色、素材、重さ、定価、注意点など)例)2010年頃に1万円で購入したジャケットです。ライトグレーで傷はありません。あわせやすいのでおすすめです。" ,rows:"7" ,maxlength:"1000" %>
      </div>
    </div>
    <%# /商品名と商品説明 %>

    <%# 下部ボタン %>
    <div class="sell-btn-contents">
      <%= f.submit "変更する" ,class:"sell-btn" %>
      <%=link_to 'もどる', root_path, class:"back-btn" %>
    </div>
    <%# /下部ボタン %>
  </div>
<% end %>

<%= render "shared/second-footer"%>

<%= render "devise/shared/links" %>
Rails.application.routes.draw do
  devise_for :users
  resources :users, only: [:index,:show]
  root to: 'users#index'

  resources :messages, only: [:create]
  resources :rooms, only: [:create,:show]


end
# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :nickname,           null: false
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.date   :birthday,           null: false
      t.integer :gender_id,         null: false
      t.integer :form_id,           null: false
      t.string :profession_name,    null: false
      t.string :want_to_do,         null: false
      t.string :can_do_list,        null: false

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

ご確認宜しくの程お願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • siruku6

    2021/02/13 12:26 編集

    >パスワードは変更が適用されず、それ以外は適用されました。
    パスワードの変更が適用されていないことはどうやって確認しましたか?

    その更新したアカウントで、新しいパスワードを使って再ログインできるかどうか、を確認していますか??

    hoshi-takanoriさんがおっしゃるように、編集画面でパスワードを見ることはできないはずですね。(DBには保存されているとは思いますが、人が見てもわからないような情報になっているはず)

    キャンセル

  • cametako

    2021/02/13 12:47

    hoshi-takanoriさん有難うございます。

    キャンセル

  • cametako

    2021/02/13 12:50

    siruku6さん
    更新したアカウントで、新しいパスワードを使って再ログインできるか確認しました。

    キャンセル

回答 1

0

devise_parameter_sanitizer.permit(:account_update, keys: [])
keys部分に、password_confirmationも設定しましょう。

設定しないと、画面で入力したデータがcontrollerに届きません。
その結果、controller上でpasswordとpassword_confirmationの不整合が起き、passwordの更新に失敗していると考えられます。

参考:

How to specify devise_parameter_sanitizer for edit action?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/02/14 09:39

    ご回答有難うございます!!
    上記の内容を試させていただいたんですが、Current password can't be blankとエラーメッセージ が表示されできない状態でした。
    ご確認宜しくお願い致します!!

    キャンセル

  • 2021/02/23 20:16

    Current password can't be blankということであれば、
    変更前passwordが送信されていないことが原因の可能性がありそうです。

    変更前のパスワードも送信してパスワード変更を書けるように、画面のつくりや処理も見直してみてはいかがでしょう?

    キャンセル

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Rubyに関する質問
  • deviseの情報編集時にpasswordの変更更新ができない!!! "password"=>"[FILTERED]"となってしまう。