#概要
deviseでユーザー管理機能を実装した際、
「ユーザーがパスワードやアイコンの画像を編集・変更が行える機能は必須では・・・」
と考えられたため実装しました。deviseで作成したupdateの設定やapplication_controller.rbに追記を行えば簡単に実装できましたのでここに記述します。
#環境
-
macOS Big Sur バージョン 11.2.3
-
Ruby 2.6.5
-
Rails 6.0.3.6
-
Mysql Ver 14.14 Distrib 5.6.51
#前提
- deviseをインストールし、モデルを作成している。
※この記事ではコントローラーの作成から始めます。
#流れ
1.deviseのコントローラーを作成
2.edit.html.erbにformを記述
3.routes.rbにupdateのルーティングを記述
4.application_controller.rbにてupdateによるパラメーターの変更を許可する
5.registrations_controller.rbに上書き後の遷移先を記述
#1.deviseのコントローラーを作成
deviseのコントローラーを作成します。
rails g devise:controllers users
↑ユーザー情報に関わるモデル名
これでregistrations_controller.rbを含むdeviseのコントローラーが作成されます。
#2.edit.html.erbにformを記述
<%= form_with model: @user, url:user_registration_path, class: 'registration-main', local: true do |f| %>
↑ 「rails routes」で表示されるusers/registrations#updateのPrefixを記述。
#3.routes.rbにupdateのルーティングを記述
edit.html.erbで設定したボタンを押すとregistrations_controller.rbを経由してデータが上書きされるようにします。
Rails.application.routes.draw do
devise_for :users, controllers: {
sessions: "users/sessions",
registrations: "users/registrations" # registrations_controller.rbに導くためのルーティングを記述
}
# 中略
root to: 'photos#index'
end
registrations_controller.rbを経由するためのルーティングを設定しました。
#4.application_controller.rbにてupdateによるパラメーターの変更を許可する
sign_upの際に「初期設定のないカラムを保存するための許可」を記述されたと思われます。
updateの際も同様に「上書きする許可」を記述します。
今回は「nickname,imgae,password」の編集・変更機能を実装することが目的だったので以下のようにしました。
class ApplicationController < ActionController::Base
# 中略
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :nickname, :self_introduction, :image, :twitter, :facebook, :instagram])
devise_parameter_sanitizer.permit(:account_update, keys: [:nickname, :image]) #account_updateにつづいて編集・変更したいカラム名を入れる。
end
# 中略
end
これで編集・変更機能の内容は終わりました。最後に「上書きを行った後、どこに遷移するのか」を記述します。
#5.registrations_controller.rbに上書き後の遷移先を記述
今回は上書き後に確認が行えるようcurrent_user(ログインしているユーザー)のマイページに遷移するようにします。
class Users::RegistrationsController < Devise::RegistrationsController
#中略
protected
def after_update_path_for(resource)
user_path(current_user)
end
#中略
これでregistrations#updateアクション後に、after_update_path_forのパスにリダイレクトします。以上