現在プログラミングスクールで学習しています。
卒業を控え、オリジナルアプリを作成しています。
その中で、Gemのdeviseを導入し、ユーザー情報を管理しています。
今回ユーザー情報の編集と削除の機能を実装したのでアウトプットしていきます。
今回は編集機能のみの記述となります。
deviseを導入して、新規登録、ログイン、ログアウト、マイページの実装は
完了していることを前提に記述いたします。
すでに、userコントローラーとuserモデルは作成しています
devise編集機能の実装
ルーティングの設定
routes.rb
Rails.application.routes.draw do
devise_for :users
root to: 'posts#index'
resources :users, only: [:show, :edit, :update, :destroy] # edit,update,destroyを記述する
resources :posts do
resources :post_likes, only: [:create, :destroy]
resources :comments, only: :create do
resources :likes, only: [:create, :destroy]
end
end
end
コントローラーの設定
comtrollers/user_controller.rb
※上記は省略しています
def edit
end
def update
@post = @user.posts
@post_like = @user.post_likes
if @user.update(user_params)
redirect_to user_path(@user.id)
else
render "devise/registrations/edit"
end
end
def destroy
if @user.destroy
redirect_to root_path
else
render :show
end
end
private
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:nickname, :profile, :email, :image)
end
def move_to_user
unless user_signed_in? && current_user.id == @user.id
redirect_to root_path
end
end
end
注目するのは、user_paramsメソッドです。
ここに更新したい、カラムを記述します。今回パスワードは更新しなくていいようにするので記述してません。
パスワードを除外する設定は後ほど記述します。
move_to_userメソッドは本人以外がアクセスしたら、トップページに戻すという設定です。
アプリケーションコントローラー
controllers/apolication_controller.rb
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :profile, :image])
devise_parameter_sanitizer.permit(:account_update, keys: [:nickname, :profile, :image])
end
deviseはpasswordとemail以外にカラムを設定し、パラメーターで送る場合では、
application_controllerに記述が必要です。
contorollers/user/registrations_controller.rbの設定
% rails g devise:controllers users
ターミナルより上記を実行します。
するとこれらのファイルが生成されます。
今回使用するのは、registrations_controller.rb
registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
protected
def update_resource(resource, params)
resource.update_without_password(params)
resource.image.attach(account_update_params[:image])
end
end
resource.update_without_password(params)こちらは、編集時にパスワードは除外する
という設定です。
resource.image.attach(account_update_params[:image])こちらは、プロフィール
写真の変更を行うのに必要な記述です。
今回プロフィール写真の設定はActive Storageを導入しているためこちらを記述しました。
Viewの設定
views/devise/registrations/edit.html.erb
<%= form_with model: @user, url: user_path(@user.id), local: true do |f| %>
<%= render 'posts/error', model: f.object %>
<div class="field">
<%= f.label :email, "メールアドレス", class: :form__text_1 %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
<div class="field">
<%= f.label :image, "プロフィール写真" ,class: :form__text_1 %><br />
<%= f.file_field :image %>
</div>
<div class="field">
<%= f.label :nickname, "nickname",class: :form__text_1 %><br />
<%= f.text_field :nickname %>
</div>
<div class="field">
<%= f.label :profile, "プロフィール(自分を一言で表現してください)" ,class: :form__text_1 %><br />
<%= f.text_area :profile, class: :form__text %>
</div>
<div class="actions">
<%= f.submit "更新する", class: :form__btn %>
</div>
ファイルは、registrationsのフォルダに手動で作成しました
パスワードとパスワード再設定の記述は除外しています。
以上が実装の手順です。
まだまだ、初心者なので間違っていることがあるかもしれません。
もし何かございましたらコメントお願いいたします。