この記事ではdeviseを用いたユーザー管理機能において、パスワード不要で
ユーザー情報を編集・更新する方法をアウトプットしていきます。
【前提】
・Rubyバージョン2.6.5
・Railsバージョン6.0.0
・gem 'devise'によるユーザー管理機能を作成済み。
・ユーザーのマイページを作成済み。
【この記事の構成】
①ルーティングを設定
②registrations_controller.rbを作成
③registrations_controller.rbを編集
④user.rbを編集
⑤application_controller.rbを編集
⑥editビューを編集
#①ルーティングを設定する
まずはregistrations_controller.rb
を使えるようにルーティングを変更します。
Rails.application.routes.draw do
devise_for :users, controllers: {
registrations: "users/registrations"
}
end
※参照した記事にはsessions: "users/sessions"
の記述もありましたが、
自分はこれを加えるとログアウトの際にsessionに関するエラーが出ました。
(sessionの設定だけして、関連するファイルを作成していなかったためと思われる)
#②registrations_controller.rbを作成する
次にコントローラーの編集です。
app/controllers/users/registrations_controller.rb
となるように
ファイルを作成します。
手動で作成できます↓
1.controllersディレクトリ下に、usersフォルダを作る。
2.usersフォルダ内にregistrations_controller.rb
ファイルを作成する。
#③registrations_controller.rbを編集する
deviseで実装されているupdate_without_password
は、パスワードを入力せずに更新ができるメソッドです。
class Users::RegistrationsController < Devise::RegistrationsController
protected
# パスワードなしで更新できるメソッド
def update_resource(resource, params)
resource.update_without_password(params)
end
# 編集後のリダイレクト先を指定するメソッド
def after_update_path_for(resource)
user_path(resource)
end
end
※リダイレクト先のパスを user_path(resource) とすると、登録後にユーザーの個人ページ、つまり「マイページ」のようなページにリダイレクトされるようになります。
#④user.rbを編集する
validates :password, presence: true, on: :create
devise機能を使うと、デフォルトでpasswordにバリデーションがかかっています。
このままだとそのデフォルト機能が編集の情報入力にも適用されるので、createアクションのみにバリデーションが動作するよう設定します。
#⑤application_controller.rbを編集する
class ApplicationController < ActionController::Base
before_action :config_permitted_parameters, if: :devise_controller?
private
def config_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
# この一行を追加↓
devise_parameter_sanitizer.permit(:account_update, keys: [:image, :name, :text])
end
end
パラメータを受け取る際は、コントローラーにストロングパラメーターを記述しますが、
deviseの処理を行うコントローラーはGem内に記述されているため、直接編集することができません。
そこで使うのが、application_controller
です。
前提条件の時点で、すでにsign_up
に関する処理の記述はあると思うので
その下にaccount_update
の記述を加え、欲しい値を受け取れるようにします。
#⑥editビューを編集する
あとは編集画面のビューを編集するだけです。
% rails g devise:views
上記のコマンドを実行すると、app/views/devise/registrations/edit.html.erb
が作成されます。
ファイルを開くとデフォルトのコードが書かれているのが分かります。
このときform_forに関する記述はそのまま使い、中身だけ書き換えましょう。
# これはそのまま使えます。
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
あとはいつも通りブロック変数f
を使って、必要なフォームを作成していきます。
ステップ③でリダイレクト先は指定しておいたので、f.submit
を押せばマイページへと戻ります。
以上でパスワード不要のdeviseユーザー編集・更新機能の実装は完了です!お疲れ様でした。
ご指摘などあれば、ご教授いただけると幸いです。
参考にした記事
【devise】パスワード入力無しのユーザー情報編集機能の実装
Deviseをカスタマイズして、アカウントを編集した後のリダイレクト先を変更する
devise ユーザーのプロフィール画面作成と編集(デフォルトをカスタマイズ)
【Rails】deviseでユーザー編集機能を現在のパスワードなしで更新してみる。