Ryota400’s blog

エンジニアを目指して書いてます。

掲示板の編集・削除機能の実装

ルーティングの設定

resources :boards do
    resources :comments, only: %i[create], shallow: true
  end

コントローラの設定

app/controllers/boards_controller.rb

def edit; end

  def update
    if @board.update(board_params)
      redirect_to @board, success: t('defaults.message.updated', item: Board.model_name.human)
    else
      flash.now['danger'] = t('defaults.message.not_updated', item: Board.model_name.human)
      render :edit
    end
  end

  def destroy
    @board.destroy!
    redirect_to boards_path, success: t('defaults.message.deleted', item: Board.model_name.human)
  end

  private

  def find_board
    @board = current_user.boards.find(params[:id])
  end
# このメソッドはset_boardという命名でも良い。

@board.destroy!を使っている理由は、削除処理は「必ず成功するもの」だからだ。 また。save save! は、処理が失敗したときの挙動が違います。 前者はfalse を返し、後者は例外を返します。 例えば、掲示板作成でタイトルを入力漏れし、falseが帰ってきたら、エラー表示箇所を訂正してまた作成を試みます。掲示板作成は「失敗する可能性がある」処理です。 一方、削除の処理は失敗する余地がない処理です。この処理が失敗したときは、意図的に処理を止めてデバッグが必要になります。

ビューを作成

app/views/boards/_board.html.erb

 <%= render 'crud_menus', board: board if current_user.own?(board) %>

app/views/boards/_crud_menus.html.erb

<ul class='crud-menu-btn list-inline float-right'>
  <li class="list-inline-item">
    <%= link_to edit_board_path(board), id: "button-edit-#{board.id}" do %>
      <%= icon 'fa', 'pen' %>
    <% end %>
  </li>
  <li class="list-inline-item">
    <%= link_to board_path(board), id: "button-delete-#{board.id}", method: :delete, data: { confirm: t('defaults.message.delete_confirm') } do %>
      <%= icon 'fas', 'trash' %>
    <% end %>
  </li>
</ul>

app/views/boards/show.html.erb

<%= render 'crud_menus', board: @board if current_user.own?(@board) %>

英語のように読み解くと、 crud_menusパーシャルを呼び出しパーシャル内のboardに@boardを代入する。 もし、current_userのidが@boardのuser_idと一致していたら

current_userと掲示板作った人が一致しているか確認している。

編集のリンクを編集ページのパスに変更、削除のリンクを削除確認アラートを表示させるように、部分テンプレートを変更する。

掲示板編集のビューを追加する app/views/boards/edit.html.erb

<% content_for(:title, @board.title) %>
<div class="container">
  <div class="row">
    <div class="col-lg-8 offset-lg-2">
      <h1><%= t('.title') %></h1>
      <%= render 'form', { board: @board } %>
    </div>
  </div>
</div>

参考文献

qiita.com