3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】deviseにおけるユーザー情報の編集・更新のやり方(パスワード不要)

Last updated at Posted at 2021-09-30

この記事では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を使えるようにルーティングを変更します。

routes.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は、パスワードを入力せずに更新ができるメソッドです。

app/controllers/users/registrations_controller.rb
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を編集する

user.rb
validates :password, presence: true, on: :create

devise機能を使うと、デフォルトでpasswordにバリデーションがかかっています。
このままだとそのデフォルト機能が編集の情報入力にも適用されるので、createアクションのみにバリデーションが動作するよう設定します。

#⑤application_controller.rbを編集する

app/controllers/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に関する記述はそのまま使い、中身だけ書き換えましょう。

app/views/devise/registrations/edit.html.erb
# これはそのまま使えます。
<%= 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でユーザー編集機能を現在のパスワードなしで更新してみる。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?