⑩日記の削除機能を実装

この章でのゴール

・投稿した日記を、トップページから削除できるようにする

日記の削除機能を実装

この章では、投稿した日記の削除機能を実装していきます。

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

Postsコントローラの設定

まず、app/controllers/posts_controller.rbを開き、以下の通り保存します。

require 'fileutils'

class PostsController < ApplicationController
  before_action :require_login

  def new
    @post = Post.new
  end

  def create
    @post = current_user.posts.new(post_params)

    if @post.save
      redirect_to '/', success: '投稿しました。'
    else
      flash.now[:danger] = "投稿に失敗しました"
      render :new
    end
  end

  def edit
    @post = Post.find(params[:id])
  end

  def update
    @post = Post.find(params[:id])
    if @post.update_attributes(post_params)
      redirect_to '/'
    else
      flash.now[:danger] = "編集に失敗しました"
      render 'edit'
    end
  end

  def destroy
    post = Post.find(params[:id])
    post.destroy
    Dir.rmdir("#{Rails.root.to_s}/public/uploads/post/image/#{post.id}")
    flash.now[:danger] = "投稿を削除しました。"
    redirect_to '/'
  end

  private

  def post_params
    params.require(:post).permit(:image, :title, :description)
  end

  def require_login
    redirect_to '/' if current_user.blank?
  end

end

 

↑ここで追加したdestroyメソッドは、投稿を削除する際に呼ばれるメソッドです。

また、1行目に、require ‘fileutils’を追加しています。

これは、ファイルやフォルダを削除するためのライブラリです。

Postレコードを削除しても、画像を保存しているフォルダなどが残ってしまうので、上記のライブラリを追加(require)して、ディレクトリを操作できるようにしています。

Dir.rmdir:指定したディレクトリを削除

Rails.root.to_sRailsプロジェクトのルートディレクトリを取得

削除ボタンの設置

次に、app/views/pages/index.html.erbを開いて、トップページに削除ボタンを設置します。
<div class="container">
  <div class="row">
    <% if current_user %>
      <div class="col-md-10 col-md-offset-1 text-center">
        <h3>一覧</h3>
        <table class="table table-bordered">
          <thead>
            <tr>
              <th>No</th>
              <th></th>
              <th>タイトル</th>
              <th>内容</th>
              <th></th>
            </tr>
          </thead>
          <tbody>
            <% @posts.each do |post| %>
              <tr>
                <td><%= post.id %></td>
                <td><%= image_tag post.image.url, class: 'thum_image' %></td>
                <td><%= link_to post.title, edit_post_path(post.id) %></td>
                <td><%= post.description %></td>
                <td>
                  <%= link_to '削除', post, class: 'btn btn-danger', method: :delete, data: { confirm: 'この投稿を削除しますか?' } %>
                </td>
              </tr>
            <% end %>
          </tbody>
        </table>

        <%= paginate @posts %>

      </div>
    <% else %>
      <div class="login col-md-4 col-md-offset-4 text-center">
        <h3>TOPページ</h3>
        <p>以下から選択してください。</p>
        <%= link_to 'ログイン', login_path, class: 'btn btn-primary btn-block btn-large' %>
        <%= link_to 'ユーザ登録', new_user_path, class: 'btn btn-default btn-block btn-large' %>
      </div>
    <% end %>
  </div>
</div>

 

ここまでの実装が完成したら、画像の通り、トップページに削除ボタンが追加されています。

削除ボタンを押して、投稿した日記が削除されていればOKです。

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

コメントを残す

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

CAPTCHA