初めに
このような方におすすめの記事です
・devise ユーザー編集の方法を知りたい
・デフォルトの「現在のパスワード」を入力せずにデータをアップデートしたい
前提
・deviseを導入済(インストール〜モデル作成まで)
・編集機能のレイアウトを作成済
以下の記事を参考に導入しています。
[Devise] パスワードを入力せずにユーザー情報を編集する
Deviseでパスワードの入力無しでユーザー情報の更新をする方法
手順
①deviseのコントローラーを作成する
ターミナル
rails generate devise:controllers users
②作成された以下のファイルに追記する
class Users::RegistrationsController < Devise::RegistrationsController
#省略
protected
def update_resource(resource, params)
resource.update_without_current_password(params)
end
#省略
end
③コントローラーに編集したデータをアップデートする時に保存を許可するカラムを追加する
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
# 新規登録時に保存を許可するカラムを追加する
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :image, :profile])
# 編集したデータをアップデートする時に保存を許可するカラムを追加する
devise_parameter_sanitizer.permit(:account_update, keys: [:name, :image, :profile])
end
end
④current_passwordフォームを削除する
<div class="field">
<%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password, autocomplete: "current-password" %>
</div>
うまくいかなかった記述
今回手順②で以下の記述を
class Users::RegistrationsController < Devise::RegistrationsController
#省略
protected
def update_resource(resource, params)
resource.update_without_current_password(params)
end
#省略
end
↓「current」がない記述にすると、変更したいパスワードを入力しても保存されなくなってしまいました。
class Users::RegistrationsController < Devise::RegistrationsController
#省略
protected
def update_resource(resource, params)
resource.update_without_password(params) #こちらにcurrentの記述がない
end
#省略
end
今回は「現在のパスワードのみ」を無くしたかったので、currentの記述を追加したことで正常にデータをアップデート(保存)できるようになりました。
自分の用途に合わせて使用していきたいと思います。
参考:最終的なビュー
【新規登録】【編集】deviseが初期から保存するもの以外では以下のカラムを追加しています。
・image(CarrierWave使用)
→設定を別に追加することなく、今回の方法で画像も編集できました
・name
・profile(自己紹介)
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= render 'shared/error_messages', model: f.object %>
<div class="field">
<%= f.label :email, "メールアドレス" %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end %>
<div class="field">
<%= f.label :image, "プロフィール画像" %><br/>
<%= f.file_field :image %>
</div>
<div class="field">
<%= f.label :name, "ユーザー名(10文字以内)" %>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :profile, "プロフィール"%><br />
<%= f.text_area :profile, class: :form__text, id:"user_profile"%>
</div>
<div class="login__attention">
<span>●</span>変更のために現在のパスワードをご入力ください
<br />
<span>●</span>パスワードを変更される場合は新しいパスワードをご入力ください
<br />
</div>
<div class="field">
<div class="field__flex">
<%= f.label :password, "パスワード(英数字6文字以上)" %>
<div class="need">必須</div><br />
</div>
<%= f.password_field :password, autocomplete: "new-password" %>
</div>
<div class="field">
<div class="field__flex">
<%= f.label :password_confirmation, "パスワード再入力" %>
<div class="need">必須</div><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>
<div class="actions">
<%= f.submit "変更する", class: :form__btn %>
</div>
<% end %>
まとめ
最後までご覧くださり、ありがとうございました。
初学者のため、記入漏れや記述ミスがありましたら教えていただけると助かります。
こちらの記事が誰かのお役に立てれば幸いです。