マイページの編集について

現在プログラミングスクールで学習しています。
卒業を控え、オリジナルアプリを作成しています。

その中で、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
```

ターミナルより上記を実行します。

[![Image from Gyazo](https://i.gyazo.com/446cf6ab2782065111075120b83970c0.png)](https://gyazo.com/446cf6ab2782065111075120b83970c0)

するとこれらのファイルが生成されます。
今回使用するのは、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のフォルダに手動で作成しました
パスワードとパスワード再設定の記述は除外しています。

以上が実装の手順です。
まだまだ、初心者なので間違っていることがあるかもしれません。
もし何かございましたらコメントお願いいたします。