⑫ユーザの退会処理を実装

この章でのゴール

・ユーザの退会機能を実装する

投稿した日記の一覧を表示

この章では、ユーザの退会機能を実装していきます。

完成イメージは下記です。

モデルメソッドの実装

まず、app/models/post.rbを開いて、以下の通り保存します。

class Post < ApplicationRecord
  validates :user_id, presence: true
  validates :title, presence: true
  validates :description, presence: true
  validates :image, presence: true

  belongs_to :user

  mount_uploader :image, ImageUploader

  def delete_with_image
    self.destroy
    Dir.rmdir("#{Rails.root.to_s}/public/uploads/post/image/#{self.id}")
  end

end

 

def delete_with_image
    self.destroy
    Dir.rmdir("#{Rails.root.to_s}/public/uploads/post/image/#{self.id}")
end

 

↑ここでは、delete_with_imageというモデルメソッドを新たに定義しています。

これは、日記(post)を削除するメソッドであり、今まではPostsコントローラに書いていた内容ですね。

日記の削除という機能は、「削除ボタンから日記を削除する」以外にも、「ユーザが退会する際に、そのユーザの投稿していた日記を全て削除する」という場面でも利用する必要があります。

Postsコントローラにその処理を記載してしまうと、ユーザの削除時に、Usersコントローラから、処理を実行できなくなります。

そのため、モデルメソッドとして、Postモデルに削除機能を定義し、Postsコントローラからも、Usersコントローラからも、呼び出せるようにする必要があります。

[box02 title=”モデルメソッドとは”]

モデルに記載するメソッドであり、そのモデルに付随する処理を記載する。

今回の場合、「日記の削除をする + 日記の画像を削除する」という処理をする必要があるので、Postモデルに定義した。

[/box02]

Usersコントローラの設定

app/controllers/users_controller.rbを開き、以下のコードを追加します。

def destroy
  user = User.find(params[:id])
  user.posts.map { |post| post.delete_with_image }
  user.destroy
  redirect_to '/'
end

 

順番に解説します。

user.posts.map { |post| post.delete_with_image }

 

users.postsで、ユーザの日記を全て取得し、mapメソッドで全ての日記(posts)に対して、delete_with_imageメソッドを適用しています。

user.destroy

 

↑userを削除しています。

Postsコントローラの修正

次に、app/controllers/posts_controller.rbを開き、以下の通り変更します。

post.destroy
Dir.rmdir("#{Rails.root.to_s}/public/uploads/post/image/#{post.id}")

↓

post.delete_with_image()

 

delete_with_imageメソッドに書き換えています。

ユーザ退会ボタンの設置

最後に、ユーザ情報の編集ページから退会処理を行えるように、ボタンを追加します。

app/views/users/edit.html.erbを開き、以下の通りに保存します。

<div class="post-new-wrapper" >
  <div class="container">
    <div class="row">
      <div class="col-md-6 col-md-offset-3">
        <h1 class="text-center">ユーザ情報の更新</h1>
        <%= form_for @user do |f| %>
          <div class="form-group">
            <%= f.label :名前, class: 'text-white' %>
            <%= f.text_field :name, class: 'form-control' %>
          </div>
          <div class="form-group">
            <%= f.label :メールアドレス, class: 'text-white' %>
            <%= f.text_field :email, class: 'form-control' %>
          </div>
          <div class="form-group">
            <%= f.label :パスワード, class: 'text-white' %>
            <%= f.password_field :password, class: 'form-control' %>
          </div>
          <div class="form-group">
            <%= f.label :パスワード(確認用), class: 'text-white' %>
            <%= f.password_field :password_confirmation, class: 'form-control' %>
          </div>

          <%= f.submit '保存', class: 'btn btn-black btn-block' %>
          <%= link_to '退会', @user, class: 'btn btn-danger', method: :delete, data: { confirm: '本当に退会しますか?' } %>

        <% end %>
      </div>
    </div>
  </div>
</div>

 

<%= link_to '退会', @user, class: 'btn btn-danger', method: :delete, data: { confirm: '本当に退会しますか?' } %>

 

↑上記で追加したコードです。

ユーザ情報の編集ページへ移行すると、以下の画像のように表示されるはずです。

実際に、退会ボタンを押してみて、rails cPostモデルUserモデルのカラムが消えているか確認しましょう。

[23] pry(main)> User.all
  User Load (0.1ms)  SELECT "users".* FROM "users"
=> []


[25] pry(main)> Post.all
  Post Load (0.2ms)  SELECT "posts".* FROM "posts"
=> []

 

ここまで完成したら、githubへプッシュしておきましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA